試圖找到一種方法來使用來自一個資料庫的宣告變數的結果以在不同的資料庫中使用:
例如:
USE DB1
GO
DECLARE @d DATETIME
SELECT TOP 1 @d = Date
FROM DateDB
USE DB2
GO
PRINT @d
錯誤:
必須宣告標量變數“@d”
不知道這是否可能,所以在最后 45 分鐘谷歌搜索(可能不正確)之后,我想我會問 SO。
uj5u.com熱心網友回復:
區域變數僅在單個批次的生命周期記憶體在。
在 SSMS 中,GO關鍵字(假設它沒有在設定中更改)分隔批次。
以下陳述句GO是一個新的單獨批次;要持久化您需要存盤的資料 - 您可以為此目的在 TempDB 中創建一個表。
uj5u.com熱心網友回復:
SQL Server Management Studio 和 sqlcmd將go關鍵字視為批處理分隔符。它表示新批次的開始,每個新批次都有自己的變數。
但是,在單個會話中資料庫之間的變數有一種方便的存盤方式:會話存盤。這些背景關系變數在會話的生命周期內持續存在,并且可以在多個批次中參考。
使用sp_set_session_context系統程序設定會話背景關系變數。使用SESSION_CONTEXT()函式檢索會話背景關系變數。
例如:
USE DB1
GO
DECLARE @d DATETIME
SELECT @d = '1/1/2022'
PRINT @d
EXEC sp_set_session_context @key = N'MyDate', @value = @d
USE DB2
GO
DECLARE @d DATETIME
SELECT @d = CAST(SESSION_CONTEXT(N'MyDate') AS DATETIME)
PRINT @d
輸出:
Jan 1 2022 12:00AM
Jan 1 2022 12:00AM
如果您需要跨多個會話記住一個變數,則必須將該變數保存到持久存盤中,例如 tempdb 表或全域臨時 ##Table。
例如,初始化批處理可以將日期值保存在名為tempdb..MyVariablescolumn的 tempdb 表中MyDate。稍后處理此資訊的會話可以參考此表列中的值。最后的清理會話可以完全洗掉表。
uj5u.com熱心網友回復:
您應該使用架構指定全名
例如
SELECT * FROM DB1.dbo.MyTable
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/481348.html
