我需要将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
是一个varbinary或binary变量,保存与当前会话或连接相关联的上下文值。
而不是任何恰好的任意表达式计算的二进制值。
当然,如果没有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();