問題:
嘗試使用儲存在變數(例如「@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中文網其他相關文章!