试图找到一种方法,使用从一个数据库声明的变量的结果在不同的数据库中使用:
例如:
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..MyVariables
列MyDate
的tempdb表中保存日期值。以后处理此信息的会话可以引用该表列中的值。最后的清理会话可以完全删除表。
应该使用schema指定整个名称
例如
SELECT * FROM DB1.dbo.MyTable