gpt4 book ai didi

sql - CONTEXT_INFO() 和转换

转载 作者:行者123 更新时间:2023-12-02 11:26:01 25 4
gpt4 key购买 nike

试图为 this 构建示例代码问题,我遇到了 CONTEXT_INFO() 的问题.

我正在做的是将 int 转换为 varbinary(128) 以便我可以将其传递给 SET CONTEXT_INFO .我可以在执行 SET 之前将 varbinary 转换回 int,但是在我 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

结果
    @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

我是否尝试直接从 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]

结果
Convert @varBin128)
-------------------
1

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

Convert twice
-------------
1

最佳答案

varbinary(128) 是一个 128 字节的内存块。 int 是一个 4 字节的内存块。所以你可以像这样恢复int:

select convert(int,convert(varbinary(4),CONTEXT_INFO()))

varbinary 中的 var 表示实际长度不同,括号中的数字仅指定最大大小。所以这个 SELECT 语句显示一个 4 字节的 varbinary:
select convert(varbinary(128), 1)

但是,当您将 CONTEXT_INFO() 转换为 varbinary(128) 时,您实际上会得到一个 128 字节的 varbinary。这个例子是一个很好的演示:
set context_info 1
select convert(int,convert(varbinary(5),context_info()))

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

关于sql - CONTEXT_INFO() 和转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1616229/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com