8

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

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

4

3 回答 3

12

询问:

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

于 2013-05-07T09:51:38.103 回答
4

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。这样,其他例程就无法改变它了。

于 2018-10-23T12:10:10.003 回答
1
SET CONTEXT_INFO 0x01010101
GO
SELECT context_info 
FROM sys.dm_exec_sessions
WHERE session_id = @@SPID;
GO

这样你就可以伪造全局/会话变量有关更多信息:Context_info

于 2013-05-07T09:54:16.510 回答