我正在尝试执行此查询:
declare @tablename varchar(50) set @tablename = 'test' select * from @tablename
这将产生以下错误:
Msg 1087,第16级,状态1,第5行 必须声明表变量“ @tablename”。
Msg 1087,第16级,状态1,第5行
必须声明表变量“ @tablename”。
动态填充表名的正确方法是什么?
对于静态查询(如您的问题中的查询),表名和列名必须是静态的。
对于动态查询,应动态生成完整的SQL,并使用sp_executesql执行它。
这是一个脚本示例,用于比较不同数据库的相同表之间的数据:
静态查询:
SELECT * FROM [DB_ONE].[dbo].[ACTY] EXCEPT SELECT * FROM [DB_TWO].[dbo].[ACTY]
由于我想轻松更改tableand的名称schema,因此创建了以下动态查询:
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的诅咒和祝福