我有一个大型数据库脚本,将同一结构的多个数据库迁移到一个目标数据库。此目标数据库更通用,因此可以存储来自不同源数据库的数据。我使用变量来跟踪当前正在迁移的实体,因此我知道要在目标表中插入什么ID。
此时迁移性能非常糟糕。为了能够更好地分析脚本,我想通过在每次表迁移后放置'go'来拆分脚本,但这会破坏变量。有没有办法声明一个可供整个连接/会话访问的变量?就像temp #table一样?
答案 0 :(得分:7)
<强>查询:强>
DECLARE
@UserID TINYINT = 1
, @LocaleID INT = 123456789
, @ApplicationID BIGINT = 123456789123456789
, @UserName VARCHAR(10) = 'User1'
, @context VARBINARY(128)
SELECT @context =
CAST(@UserID AS BINARY(1)) +
CAST(@LocaleID AS BINARY(4)) +
CAST(@ApplicationID AS BINARY(8)) +
CAST(@UserName AS BINARY(10))
SET CONTEXT_INFO @context
GO
SELECT
UserID = CAST(SUBSTRING(ci, 1, 1) AS TINYINT)
, LocaleID = CAST(SUBSTRING(ci, 2, 4) AS INT)
, ApplicationID = CAST(SUBSTRING(ci, 6, 8) AS BIGINT)
, UserName = CAST(SUBSTRING(ci, 14, 10) AS VARCHAR)
FROM (SELECT ci = CONTEXT_INFO()) t
<强>结果:强>
UserID LocaleID ApplicationID UserName
----------- ----------- ------------------ ------------------------------
1 123456789 123456789123456789 User1
其他信息:
答案 1 :(得分:2)
通过BiningList<>
,您可以使用sp_set_session_context:
SQL Server 2016
设置变量,然后通过以下内容读取:
EXEC [sys].[sp_set_session_context] @key = 'SecurityObjectUserID'
,@value = @SecurityObjectUserID
,@read_only = 1;
请注意,我们可以将变量标记为SELECT @SecurityObjectUserID = CONVERT(BIGINT,SESSION_CONTEXT(N'SecurityObjectUserID'));
。这样,其他例程将无法更改它。
答案 2 :(得分:1)
SET CONTEXT_INFO 0x01010101
GO
SELECT context_info
FROM sys.dm_exec_sessions
WHERE session_id = @@SPID;
GO
这样你可以伪造全局/会话变量
有关详细信息:Context_info