0

如何将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 字符

4

1 回答 1

0

CONTEXT_INFO是固定长度binary(128)而不是varbinary(128). 解析错误是由于正在评估尾随二进制零。

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

因此,如果您的基本目标是存储和检索用户、日志和文化值,您可以SESSION_CONTEXT为这 3 个值创建条目,而不是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);
于 2019-05-12T12:35:27.413 回答