您无法使用简单的 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;
对于实际的子查询,您可以通过检查子查询是否返回具有该列名的内容来近似相同的内容。一种方法是运行查询: 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
如果不存在,子查询将从外部查询中提取。然而,这主要取决于每一行都有一个唯一的标识符。这个问题明确地是关于子查询的,没有理由期望这些行很容易被唯一地识别。