T-SQL : 在不同的数据库中使用变量

T-SQL : using variable in different database

试图找到一种方法来使用来自一个数据库的已声明变量的结果以用于不同的数据库:

例如:

USE DB1
GO

DECLARE @d DATETIME

SELECT TOP 1 @d = Date 
FROM DateDB
 
USE DB2
GO

PRINT @d

错误:

Must declare the scalar variable "@d"

不确定是否可行,所以想问一下 S.O。在谷歌搜索(可能不正确)最后 45 分钟之后。

局部变量仅在 单个 批次的生命周期内存在。

在 SSMS 中,GO 关键字(假设在设置中未更改)分隔批次。

GO 之后的语句是一个新的独立批次;要持久化数据,您需要存储它 - 您可以为此目的在 TempDB 中创建一个 table。

你应该用架构指定全名

例如

SELECT * FROM DB1.dbo.MyTable

go 关键字被 SQL Server Management Studio 和 sqlcmd 视为批处理分隔符。它表示新批次的开始,每个新批次都有自己的变量。

但是,对于单个会话中数据库之间的变量,有一种方便的存储方式:会话存储。这些上下文变量在会话的生命周期内持续存在,并且可以在多个批次中引用。

使用 sp_set_session_context system procedure to set a session context variable. Use the 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 或全局临时 ##Table.

例如,初始化批处理可以将日期值保存在名为 tempdb..MyVariablesMyDate 的临时数据库 table 中。处理此信息的后续会话可以参考此 table 列中的值。最后的清理会话可以完全删除 table。