问题:
尝试使用存储在变量(例如“@tablename”)中的表名执行查询时,会收到错误消息,指出必须声明表变量“@tablename”。
解决方案:
在像问题中所示的静态查询中,表名和列名必须是静态的。对于表名动态填充的动态查询,必须动态生成完整的SQL,并使用sp_executesql
执行。
示例:
假设我们要比较不同数据库中相同表的数据。静态查询如下所示:
<code class="language-sql">SELECT * FROM [DB_ONE].[dbo].[ACTY] EXCEPT SELECT * FROM [DB_TWO].[dbo].[ACTY]</code>
为了使此查询动态化,可以将模式和表名设置为变量:
<code class="language-sql">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;</code>
通过使用sp_executesql
,可以执行动态生成的SQL。
其他注意事项:
动态查询需要仔细考虑和维护。建议在代码中实现此类查询之前,熟悉动态SQL的详细信息。
以上是如何在 SQL 查询中使用表名变量?的详细内容。更多信息请关注PHP中文网其他相关文章!