sql - 表名作为变量

标签 sql sql-server tsql variable-names tablename

我正在尝试执行此查询:

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/

相关文章:

mysql - group_concat 在 SQL 查询中多次显示相同的记录

SQL 更新,更新所有行 (MS-SQL 2008)

sql-server - 如何从“连接到服务器”对话框中删除缓存的服务器名称?

sql - 新手 SQL 更新问题

sql - 检查字段值是否在 sql server 触发器上更新

sql - 删除除 TOP 1 之外的其他内容

mysql - Cakephp电子商务数据库设计

sql - 与日期比较时忽略 WHERE 子句中的时间戳

mysql - sql 排序依据和分组依据

asp.net - "ASP.NET"错误 : Access to the remote server is denied because no login-mapping exists