为什么不能在一行语句中设置T-SQL CONTXT_INFO变量



我需要将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将实时生成,因此硬编码常数二进制值将不起作用…

根据:http://msdn.microsoft.com/en-us/library/ms187768.aspx

"SET CONTEXT_INFO不接受常量或变量名以外的表达式。要将上下文信息设置为函数调用的结果,必须首先将函数调用的结果包含在二进制或varbinary变量中。"

Transact-SQL是一个非常简单的语言。在大多数现代语言中,您希望能够在简单值有效的大多数位置提供任意表达式—但T-SQL不是这种情况。因此,如果我们看一下SET CONTEXT_INFO的语法图:

SET CONTEXT_INFO { binary_str | @binary_var }

您只能提供以下选项之一:

binary_str

是一个二进制常量,或者是一个隐式转换为二进制的常量,用于关联当前会话或连接。

@binary_var

是一个varbinarybinary变量,保存与当前会话或连接相关联的上下文值。

而不是任何恰好的任意表达式计算的二进制值。


当然,如果没有CAST s,这将是一个常量,所以您可以直接写:

SET CONTEXT_INFO 0xF9EE3BA5FF4A7A93857A2C27B845B755

try this

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();

最新更新