Sql-Server
在 SQL 查詢中選擇數據庫的變數
如果我想在
FROM
SQL 查詢的子句中使用變數,我需要使用動態 SQL。如果查詢又長又復雜,這可能會很痛苦。從您目前未連接到的數據庫中執行查詢的方法有幾種。我最常用的兩種方法是這些..
Select * from msdb..sysjobs_view
或者
USE MSDB Select * from sysjobs_view
如果您從 master 數據庫開始,以上兩種方法都會給您相同的結果。
當我將它們都放入動態 SQL 時,一個有效,另一個無效
從大師開始,這有效
DECLARE @DBN SYSNAME SET @DBN = 'msdb' DECLARE @Sql NVARCHAR(MAX) SET @Sql = N'Select * from ' + @DBN + '..sysjobs_view' EXEC (@Sql)
但這並不
DECLARE @DBN SYSNAME SET @DBN = 'msdb' DECLARE @Sql NVARCHAR(MAX) SET @Sql = N'USE ' + @DBN EXEC (@Sql) Select * from sysjobs_view
我得到錯誤
消息 156,級別 15,狀態 1,第 14 行關鍵字“EXEC”附近的語法不正確。
我這樣做的原因是:在大型複雜查詢中使用一行動態 SQL 比嘗試將整個查詢轉換為動態 SQL 更容易編寫程式碼。我的問題只是關於為什麼它不能與該
USE
條款一起使用。為什麼我不能使用帶有
USE
子句的動態 SQL來更改數據庫上下文?注意:以下確實有效,並且很容易編碼。但是我關於為什麼的問題仍然存在。
DECLARE @DBN SYSNAME SET @DBN = 'msdb' DECLARE @Sql NVARCHAR(MAX) SET @Sql = N'USE ' + @DBN +' Select * from sysjobs_view ' EXEC (@Sql)
根據Tibor Karaszi 的評論,該更改僅適用於“EXEC 範圍”,這已通過下面的 Microsoft 聲明進行驗證。
在 SQL Server 中,可以指定 varchar(max) 和 nvarchar(max) 數據類型,允許字元串最大為 2 GB 的數據。
數據庫上下文中的更改僅持續到 EXECUTE 語句結束。 來源
最簡單的解決方法可能是問題中的最後一個範例。在程式碼的開頭和結尾添加幾行程式碼可以更改單次執行的上下文。您的其餘程式碼保留在“執行”之前的任何上下文中
DECLARE @DBN SYSNAME SET @DBN = 'msdb' DECLARE @Sql NVARCHAR(MAX) SET @Sql = N'USE ' + @DBN +' -- Add this Select * from sysjobs_view -- Up to 2GB of code here ' --And add this EXEC (@Sql)
使用這種動態 SQL 解決方案有一些限制 如果您的 2GB 程式碼中有單引號,則必須通過加倍單引號來對其進行轉義。 如果有很多程式碼需要審查和測試,這可能是一個巨大的痛苦。