CONTEXT_INFO()和CONVERT

Rob*_*son 6 sql t-sql sql-server

为了尝试为这个问题构建示例代码,我遇到了一个问题CONTEXT_INFO().

我正在做的是将int转换为varbinary(128),以便我可以将其传递给SET CONTEXT_INFO.我可以在执行SET之前将varbinary转换回int,但在I SET然后GET之后,即使varbinary值明显不为零,CONVERT也总是返回零.

二进制不是我的强项,所以我可能会错过一些简单的东西.

SET NOCOUNT ON
USE tempdb
GO

DECLARE @number         int
DECLARE @ContextInfo    varbinary(128)

SET @number =  16777216

SET @ContextInfo = CONVERT(varbinary(128), @number)

SELECT @number                     AS [@number]
SELECT @ContextInfo                AS [@ContextInfo]
SELECT CONVERT(int, @ContextInfo)  AS [CONVERT(int, @ContextInfo)]

SET CONTEXT_INFO @ContextInfo
GO

SELECT CONTEXT_INFO()               AS [CONTEXT_INFO()]
SELECT CONVERT(int, CONTEXT_INFO()) AS [CONVERT(int, CONTEXT_INFO()) (Zero)]
GO

DECLARE @ContextInfo    varbinary(128)

SET @ContextInfo = CONTEXT_INFO()

SELECT @ContextInfo                 AS [@ContextInfo]
SELECT CONVERT(int, @ContextInfo)   AS [CONVERT(int, @ContextInfo)   (Zero)]
GO
Run Code Online (Sandbox Code Playgroud)

结果

    @number
-----------
   16777216

@ContextInfo
-----------------------------------
0x01000000

CONVERT(int, @ContextInfo)
--------------------------
                  16777216

CONTEXT_INFO()
-----------------------------------
0x0100000000000000[... more zeroes]

CONVERT(int, CONTEXT_INFO()) (Zero)
-----------------------------------
                                  0

@ContextInfo
-----------------------------------
0x0100000000000000[... more zeroes]

CONVERT(int, @ContextInfo)   (Zero)
-----------------------------------
                                  0
Run Code Online (Sandbox Code Playgroud)

无论我是尝试直接转换CONTEXT_INFO()还是写入CONTEXT_INFO()变量,结果CONVERT为零.

编辑:修复了链接文字


转换示例

此示例显示转换为varbinary(128)的int如何在没有问题的情况下转换回来,但是CONTEXT_INFO()无法进行转换.

(这是与Andomar的持续对话.)

测试

DECLARE @int        int
DECLARE @varBin128  varbinary(128)

SET @int = 1

SET @varBin128 = CONVERT(varbinary(128), @int)
SET CONTEXT_INFO @varBin128

SELECT CONVERT(int, @varBin128)     AS [Convert @varBin128)]
SELECT CONVERT(int, CONTEXT_INFO()) AS [Convert once]
SELECT CONVERT(int, CONVERT(varbinary(4), CONTEXT_INFO())) AS [Convert twice]
Run Code Online (Sandbox Code Playgroud)

结果

Convert @varBin128)
-------------------
                  1

Convert once
------------
           0

Convert twice
-------------
            1
Run Code Online (Sandbox Code Playgroud)

And*_*mar 13

varbinary(128)是128字节的存储器块.int是4字节的内存块.所以你可以像这样恢复int:

select convert(int,convert(varbinary(4),CONTEXT_INFO()))
Run Code Online (Sandbox Code Playgroud)

varbin中的var表示实际长度不同,括号中的数字仅指定最大大小.所以这个SELECT语句显示一个4字节的varbinary:

select convert(varbinary(128), 1)
Run Code Online (Sandbox Code Playgroud)

但是当你将CONTEXT_INFO()转换为varbinary(128)时,你真的得到一个128字节的varbinary.这个例子是一个很好的演示:

set context_info 1
select convert(int,convert(varbinary(5),context_info()))
Run Code Online (Sandbox Code Playgroud)

这将打印256; 整数1的最后3个字节,附加0字节.