对于静态查询,像你问题中的那个,表名和列名需要是静态的。
对于动态查询,你应该动态地生成完整的SQL,并使用sp_executesql来执行。
下面是一个用于比较不同数据库的相同表之间数据的脚本例子。
静态查询。
SELECT * FROM [DB_ONE].[dbo].[ACTY]
EXCEPT
SELECT * FROM [DB_TWO].[dbo].[ACTY]
由于我想很容易地改变table
和schema
的名称,我创建了这个动态查询。
declare @schema varchar(50)
declare @table varchar(50)
declare @query nvarchar(500)
set @schema = 'dbo'
set @table = 'ACTY'
set @query = 'SELECT * FROM [DB_ONE].[' + @schema + '].[' + @table + '] EXCEPT SELECT * FROM [DB_TWO].[' + @schema + '].[' + @table + ']'
EXEC sp_executesql @query
由于动态查询有很多细节需要考虑,而且很难维护,我建议你阅读。动态SQL的诅咒和祝福