小编典典

表名作为变量

sql

我正在尝试执行此查询:

declare @tablename varchar(50)
set @tablename = 'test'
select * from @tablename

这将产生以下错误:

Msg 1087,第16级,状态1,第5行

必须声明表变量“ @tablename”。

动态填充表名的正确方法是什么?


阅读 166

收藏
2021-05-05

共1个答案

小编典典

对于静态查询(如您的问题中的查询),表名和列名必须是静态的。

对于动态查询,应动态生成完整的SQL,并使用sp_executesql执行它。

这是一个脚本示例,用于比较不同数据库的相同表之间的数据:

静态查询:

SELECT * FROM [DB_ONE].[dbo].[ACTY]
EXCEPT
SELECT * FROM [DB_TWO].[dbo].[ACTY]

由于我想轻松更改tableand的名称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的诅咒和祝福

2021-05-05