我正在使用SQL Server 2005,需要编写一个select语句来选择表中的所有行,但只能用于某些类型的列。在我的情况下,我想要除了那些列之外的所有列类型为xml,text,ntext,image或非二进制CLR用户定义类型列。
这是个问题。如果你想知道我为什么这样做,请继续阅读。我正在使用EXCEPT
来识别两个数据库中每个表之间的差异,类似于此问题中概述的内容:SQL compare data from two tables。我不明白为什么在评论中建议INTERSECT
所以我正在使用UNION ALL。
我正在使用的代码是:
(select *, 'table a first' as where_missing from A EXCEPT select *,'table a first' as where_missing from B)
union all
(select *,'table b first' as where_missing from B EXCEPT select *, 'table b first' as where_missing from A)
某些表包含不适用于EXCEPT
的列类型。因此,我不想选择那些列。我可以从information_schema.columns获取此信息,但有一种很好的方式,我可以在上面的示例中使用它来代替“*”吗?
谢谢!
答案 0 :(得分:0)
除了使用动态SQL之外,我认为没有其他方法可以做到这一点。首先选择列:
declare @columns nvarchar(max);
select @columns = stuff(
(select ', ' + c.name
from sys.tables t
join sys.columns c on t.object_id = c.object_id
join sys.types ty on c.system_type_id = ty.system_type_id
where t.name = 'A'
and ty.name not in ('text', 'ntext', 'xml', 'image')
for xml path(''))
, 1, 2, '');
然后运行查询:
declare @sql nvarchar(max);
set @sql = 'select ' + @columns + ', ''table a first'' as where_missing from A';
exec (@sql);