为什么我无法在一行语句中设置T-SQL CONTXT_INFO变量?

3
我需要在SQL Server中设置CONTEXT_INFO变量为用户会话唯一标识符,确切地说是用户会话的GUID。但我不能用一个简短而干净的单行代码执行此操作。我必须创建新的二进制变量,然后将其分配给CONTEXT_INFO
操作如下:
DECLARE @sessionId binary(16) = CAST(CAST('A53BEEF9-4AFF-937A-857A-2C27B845B755' AS uniqueidentifier) AS binary(16)) 
SET CONTEXT_INFO @sessionId

能否将所有内容放入一行语句中?

像以下这样的直接解决方案:

SET CONTEXT_INFO CAST(CAST('A53BD5F9-4AFF-E211-857A-2C27D745B005' AS uniqueidentifier) AS binary(16)) 

很遗憾,这不起作用。我无法理解这种行为的原因。

编辑:

sessionId将会动态生成,因此硬编码常量二进制值是行不通的...


你能试一下以下的查询吗? - Azar
3个回答

1
根据:http://msdn.microsoft.com/en-us/library/ms187768.aspx "SET CONTEXT_INFO不接受除常量或变量名之外的表达式。如果要将上下文信息设置为函数调用结果,则必须首先将函数调用结果包含在二进制或varbinary变量中。"

0

试一下这个

DECLARE @sessionId varbinary(128);
SET @sessionId = CAST(REPLICATE( 'A53BD5F9-4AFF-E211-857A-2C27D745B005', 128 ) AS varbinary(128) );
SET CONTEXT_INFO @sessionId ;
SELECT CONTEXT_INFO() AS MyContextInfo;

或者只需在您的查询下添加以下行

    DECLARE @sessionId binary(16) = CAST(CAST('A53BEEF9-4AFF-937A-857A-2C27B845B755' AS uniqueidentifier) AS binary(16)) 
SET CONTEXT_INFO @sessionId
SELECT CONTEXT_INFO() AS MyContextInfo;

或者如果你能消除“-”,你也可以这样做

SET CONTEXT_INFO 0xA53BEEF94AFF937A857A2C27B845B755;
SELECT CONTEXT_INFO();

但这比我的代码还要多行!我正在尝试找到最干净和最短的解决方案! - shytikov

0

Transact-SQL是一种非常简单的语言。在大多数现代语言中,您可以在大多数简单值有效的位置提供任意表达式,但在T-SQL中并非如此。因此,如果我们查看SET CONTEXT_INFO的语法图表:

SET CONTEXT_INFO { binary_str | @binary_var }

您可以提供以下其中一项:

binary_str

是一个二进制常量,或者是可以隐式转换为二进制的常量,与当前会话或连接相关联。
@binary_var

一个varbinarybinary变量,用于保存与当前会话或连接相关联的上下文值。而不是任意计算二进制值的表达式。
当然,如果没有CAST,这将是一个常量,因此您可以直接编写:
SET CONTEXT_INFO 0xF9EE3BA5FF4A7A93857A2C27B845B755

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接