如何将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字符
答案 0 :(得分:0)
CONTEXT_INFO
是固定长度的binary(128)
,而不是varbinary(128)
。解析错误是由于对尾随的二进制零进行了评估。
考虑使用SESSION_CONTEXT
(在SQL Server 2016及更高版本中)而不是CONTEXT_INFO
。 SESSION_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,然后CAST
至XML
:
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);