【问题标题】:bad string in dynamic sql and context info动态 sql 和上下文信息中的错误字符串
【发布时间】:2018-07-20 11:56:23
【问题描述】:

这太奇怪了!下面的代码是一个t-sql。

BEGIN
    DECLARE @cinfo VARBINARY(128) = CAST('aud:83/53784862/1' AS VARBINARY(128));
    DECLARE @csinfo VARCHAR(128) = CAST(CONTEXT_INFO() AS VARCHAR(128));
    SET @csinfo = '<root><value>' + REPLACE(RIGHT(@cinfo, LEN(@cinfo) - 4), '/', '</value><value>') + '</value></root>';
    PRINT @csinfo
    SET CONTEXT_INFO @cinfo;
    DECLARE @sql VARCHAR(MAX) = '
        DECLARE @cinfo VARCHAR(128) = CAST(CONTEXT_INFO() AS VARCHAR(128));
        DECLARE @csinfo VARCHAR(512) = ''<root><value>'' + REPLACE(RIGHT(@cinfo, LEN(@cinfo) - 4), ''/'', ''</value><value>'') + ''</value></root>'';
        PRINT @csinfo
    '
    EXEC(@sql)
END

这是输出:

<root><value>83</value><value>53784862</value><value>1</value></root>
<root><value>83</value><value>53784862</value><value>1

为什么没有附加&lt;/value&gt;&lt;/root&gt;

【问题讨论】:

  • sql-server版本为2012
  • 它附加了.. 只是有一些空格。在 SSMS 的右上角观察
  • 同意,我在一堆 NULL 字符后得到&lt;/value&gt;&lt;/root&gt;
  • 一个NULL字符(CHAR(0))和一个字符串值NULL是不同的。
  • 动态 SQL 的输出与非动态运行它没有什么不同。它们都在结束标记之前加载了 NULL 字符。这并不奇怪,CONTEXT_INFO 的值以很多 0 结尾,这将转换为 NULL 字符。

标签: sql sql-server dynamic-sql context-info


【解决方案1】:

我找到了解决办法。

DECLARE @cinfo VARCHAR(128) = REPLACE(CAST(CAST(CONTEXT_INFO() AS VARCHAR(128)) COLLATE SQL_Latin1_General_CP1_CI_AS AS VARCHAR(128)), CHAR(0), '');

这将修复从CONTEXT_INFO() 转换的字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-25
    • 2017-03-11
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多