【问题标题】:How to cast context_info return value to xml如何将 context_info 返回值转换为 xml
【发布时间】:2019-05-12 10:50:52
【问题描述】:

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

【问题讨论】:

  • CONTEXT_INFObinary(128) 而不是 varbinary(128)。解析错误是由于正在评估尾随二进制零。您使用的是哪个 SQL Server 版本?
  • sql server 2016 。解决方案

标签: sql-server varbinary context-info


【解决方案1】:

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

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

因此,如果您的基本目标是存储和检索用户、日志和文化值,您可以为这 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 到 @987654341 @:

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);

【讨论】:

    猜你喜欢
    • 2016-02-20
    • 2020-10-15
    • 1970-01-01
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    相关资源
    最近更新 更多