これは、単純な SQL ステートメントでは実行できません。すべてのテーブルおよびテーブル内の列参照が存在しない限り、SQL クエリはコンパイルされません。
「サブクエリ」がテーブル参照またはビューである場合、動的 SQL でこれを行うことができます。
動的 SQL では、次のようにします。
declare @sql nvarchar(max) = '
SELECT uniqueId, columnTwo, '+
(case when exists (select *
from INFORMATION_SCHEMA.COLUMNS
where tablename = @TableName and
columnname = 'ColumnThree' -- and schema name too, if you like
)
then 'ColumnThree'
else 'NULL as ColumnThree'
end) + '
FROM (select * from '+@SourceName+' s
';
exec sp_executesql @sql;
実際のサブクエリの場合、サブクエリがその列名で何かを返したかどうかを確認することで、同じことを近似できます。これを行う 1 つの方法は、クエリを実行してから select top 0 * into #temp from (<subquery>) s
、 で列をチェックすること#temp
です。
編集:
私は通常、そのような古い質問を更新しませんが、以下のコメントに基づいています。「サブクエリ」の各行に一意の識別子がある場合は、次を実行できます。
select t.. . ., -- everything but columnthree
(select column3 -- not qualified!
from t t2
where t2.pk = t.pk
) as column3
from t cross join
(values (NULL)) v(columnthree);
サブクエリはcolumn3
、存在しない場合、外側のクエリから取得します。ただし、これは、各行に一意の識別子があることに大きく依存します。問題は明らかにサブクエリに関するものであり、行が簡単に一意に識別されると期待する理由はありません。