Sql-Server

在 SQL 查詢中選擇數據庫的變數

  • December 17, 2019

如果我想在FROMSQL 查詢的子句中使用變數,我需要使用動態 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 程式碼中有單引號,則必須通過加倍單引號來對其進行轉義。 如果有很多程式碼需要審查和測試,這可能是一個巨大的痛苦。

引用自:https://dba.stackexchange.com/questions/253195