我有一个大型数据库脚本,将相同结构的多个数据库迁移到一个目标数据库。此目标数据库更通用,因此它能够存储来自不同源数据库的数据。我使用一个变量来跟踪当前正在迁移的实体,因此我知道要在目标表中插入什么 ID。
目前迁移性能真的很差。为了能够更好地分析脚本,我想通过在每次表迁移后放置“go”来拆分脚本,但这会破坏变量。有没有办法声明一个可供整个连接/会话访问的变量?就像临时#table 一样?
我有一个大型数据库脚本,将相同结构的多个数据库迁移到一个目标数据库。此目标数据库更通用,因此它能够存储来自不同源数据库的数据。我使用一个变量来跟踪当前正在迁移的实体,因此我知道要在目标表中插入什么 ID。
目前迁移性能真的很差。为了能够更好地分析脚本,我想通过在每次表迁移后放置“go”来拆分脚本,但这会破坏变量。有没有办法声明一个可供整个连接/会话访问的变量?就像临时#table 一样?
询问:
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
附加信息:
SQL Server 2016
您可以使用sp_set_session_context:
EXEC [sys].[sp_set_session_context] @key = 'SecurityObjectUserID'
,@value = @SecurityObjectUserID
,@read_only = 1;
设置一个变量,然后读取它:
SELECT @SecurityObjectUserID = CONVERT(BIGINT,SESSION_CONTEXT(N'SecurityObjectUserID'));
注意,我们可以将变量标记为read_only
。这样,其他例程就无法改变它了。
SET CONTEXT_INFO 0x01010101
GO
SELECT context_info
FROM sys.dm_exec_sessions
WHERE session_id = @@SPID;
GO
这样你就可以伪造全局/会话变量有关更多信息:Context_info