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



试图找到一种方法,使用从一个数据库声明的变量的结果在不同的数据库中使用:

例如:

USE DB1
GO
DECLARE @d DATETIME
SELECT TOP 1 @d = Date 
FROM DateDB

USE DB2
GO
PRINT @d

错误:

必须声明标量变量"@d">

不确定是否可能,所以我想在谷歌了(可能是错误的)45分钟后问S.O.。

局部变量只在单个批处理的生命周期内存在。

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

GO后面的语句是一个新的单独批;为了持久化你需要存储的数据,你可以在TempDB中创建一个表。

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

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

使用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表或全局临时表。

例如,初始化批处理可以在名为tempdb..MyVariablesMyDate的tempdb表中保存日期值。以后处理此信息的会话可以引用该表列中的值。最后的清理会话可以完全删除表。

应该使用schema指定整个名称

例如

SELECT * FROM DB1.dbo.MyTable

相关内容

  • 没有找到相关文章

最新更新