我正在尝试执行此查询:
declare @tablename varchar(50)
set @tablename = 'test'
select * from @tablename
这会产生以下错误:
Msg 1087, Level 16, State 1, Line 5
Must declare the table variable "@tablename".
动态填充表名称的正确方法是什么?
最佳答案
对于静态查询,例如您问题中的查询,表名和列名必须是静态的。
对于动态查询,您应该动态生成完整的 SQL,并使用 sp_executesql 来执行它。
以下是用于比较不同数据库的相同表之间的数据的脚本示例:
静态查询:
SELECT * FROM [DB_ONE].[dbo].[ACTY]
EXCEPT
SELECT * FROM [DB_TWO].[dbo].[ACTY]
由于我想轻松更改表
和架构
的名称,因此我创建了这个动态查询:
declare @schema sysname;
declare @table sysname;
declare @query nvarchar(max);
set @schema = 'dbo'
set @table = 'ACTY'
set @query = '
SELECT * FROM [DB_ONE].' + QUOTENAME(@schema) + '.' + QUOTENAME(@table) + '
EXCEPT
SELECT * FROM [DB_TWO].' + QUOTENAME(@schema) + '.' + QUOTENAME(@table);
EXEC sp_executesql @query
由于动态查询有很多需要考虑的细节,并且很难维护,所以我建议您阅读:The curse and blessings of dynamic SQL
关于sql - 表名作为变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2838490/