如何设置多个批次中可用的会话变量?

时间:2013-05-07 09:46:47

标签: sql sql-server tsql

我有一个大型数据库脚本,将同一结构的多个数据库迁移到一个目标数据库。此目标数据库更通用,因此可以存储来自不同源数据库的数据。我使用变量来跟踪当前正在迁移的实体,因此我知道要在目标表中插入什么ID。

此时迁移性能非常糟糕。为了能够更好地分析脚本,我想通过在每次表迁移后放置'go'来拆分脚本,但这会破坏变量。有没有办法声明一个可供整个连接/会话访问的变量?就像temp #table一样?

3 个答案:

答案 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     

其他信息:

MSDN - CONTEXT_INFO

答案 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