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

时间:2014-07-04 09:16:09

标签: sql sql-server

我需要在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将在运行中生成,因此硬编码常量二进制值不会起作用...

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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();

答案 2 :(得分:0)

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

SET CONTEXT_INFO { binary_str | @binary_var }

您只能提供以下其中一项:

binary_str
  

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

@binary_var
  

varbinary 二进制变量是否包含与当前会话或连接关联的上下文值。

并非计算二进制值所发生的任何aribtrary表达式。


当然,没有CAST,这将是一个常数,所以你可以写:

SET CONTEXT_INFO 0xF9EE3BA5FF4A7A93857A2C27B845B755