如何将 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 和 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);
我怎样才能 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 和 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);