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