如何将context_info返回值转换为xml

时间:2019-05-12 10:50:53

标签: sql-server varbinary context-info

如何将context_info的返回值数据转换为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解析:第1行,字符41,非法的xml字符

1 个答案:

答案 0 :(得分:0)

CONTEXT_INFO是固定长度的binary(128),而不是varbinary(128)。解析错误是由于对尾随的二进制零进行了评估。

考虑使用SESSION_CONTEXT(在SQL Server 2016及更高版本中)而不是CONTEXT_INFOSESSION_CONTEXT允许使用sysname键类型(nvarchar(128))和一个sp_set_session_context类型sql_variant的值存储一个或多个键/值对。可以使用SESSION_CONTEXT函数来检索该值。

因此,如果您的基本目标是存储和检索User,Log和Culture值,则可以为这三个值创建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);