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字节.