如何将 context_info return 值转换为 xml

How to cast context_info return value to xml

我怎样才能 cast/convert context_info return 将数据值设为 XML

第一个查询工作正常,query2 不工作

-- Query 1
DECLARE @xml XML = '<row User="system" Log="1" Culture="1"/>'
DECLARE @varB VARBINARY(128);

SET @varB = CAST(@xml AS VARBINARY(128)) 

SELECT @xml, CAST(@varB AS XML)

-- Query 2
DECLARE @xml XML = '<row User="system" Log="1" Culture="1"/>'
DECLARE @varB VARBINARY(128);

SET @varB = CAST(@xml AS VARBINARY(128)) 

SET CONTEXT_INFO  @varB

SELECT @xml, CAST(@varB AS XML), CONTEXT_INFO(), CAST(CONTEXT_INFO() AS XML)

错误:

XML parsing: line 1, character 41, illegal xml character

CONTEXT_INFO 是 fixed-length binary(128) 而不是 varbinary(128)。解析错误是由于计算尾随二进制零造成的。

考虑使用 SESSION_CONTEXT (available in SQL Server 2016 onwards). SESSION_CONTEXT allows one to store one or more key/value pairs with a sysname key type (nvarchar(128)) and a value of type sql_variant with sp_set_session_context,而不是 CONTEXT_INFO。可以使用 SESSION_CONTEXT 函数检索该值。

因此,如果您的基础 objective 是存储和检索用户、日志和文化值,您可以为这 3 个值创建 SESSION_CONTEXT 条目而不是 XML

EXEC sp_set_session_context @key= N'User', @value= 'system';
EXEC sp_set_session_context @key= N'Log', @value= 1;
EXEC sp_set_session_context @key= N'Culture', @value= 1;
SELECT SESSION_CONTEXT(N'User'), SESSION_CONTEXT(N'Log'), SESSION_CONTEXT(N'Culture');

您也可以像最初尝试那样使用 XML,但是,由于 XML 不是允许的 sql_variant 类型,您需要添加 XML值为 varchar/nvarchar 和 CASTXML:

DECLARE @xml XML = '<row User="system" Log="1" Culture="1"/>';
DECLARE @xmlVarchar varchar(8000) = CAST(@xml AS varchar(8000));
EXEC sp_set_session_context @key= N'xml', @value= @xmlVarchar;
SELECT CAST(CAST(SESSION_CONTEXT(N'xml') AS varchar(8000)) AS xml);