【问题标题】:XML Value method returns empty if chars more than 43679如果字符数超过 43679,则 XML 值方法返回空
【发布时间】:2018-05-28 08:59:00
【问题描述】:

我在从 XML 列检索字符串数据时遇到问题。 我在 xml 中有一个包含大量数据的节点。如果我尝试使用value 方法或query 获取它,它会给出空字符串(即在xml 中等于NULL)。

在调试时我知道,value方法只有在字符小于或等于43679时才检索数据。

我阅读了与 43679 图相关的所有 SO 问题,这是从 SSMS 网格复制时 SSMS 中的一个错误。但这里的问题与 SSMS 无关。即使是从 .Net 应用程序调用的 SP 也遇到了同样的问题。

例如:

Declare  @XmlStr XML;

select @XmlStr=
'<Main>
  <Node1>/9j/4gIcSUNDX1BST0ZJTEUAAQEA.. 50000+Charcters ...</Node1>
</Main>';

SELECT @XmlStr.value('(/Main/Node1)[1]','varchar(max)') ;

如果 Node1 包含以下 43679 个字符,则它会给出输出。 有什么解决办法吗?还是我错过了什么??

我使用的是 SQL Server 2008R2

【问题讨论】:

    标签: sql-server xml sql-server-2008 encoding base64


    【解决方案1】:

    您不应该尝试将其作为字符串...&lt;Node1&gt; 中的值是base64 编码的二进制值。 XML 的.value() 将为您隐式重新编码。试试这个

    Declare  @XmlStr XML;
    
    select @XmlStr=
    '<Main>
      <Node1>/9j/4gIcSUNDX1BST0ZJTEUAAQEA</Node1>
    </Main>';
    
    SELECT @XmlStr.value('(/Main/Node1)[1]','varbinary(max)') 
          ,CAST(@XmlStr.value('(/Main/Node1)[1]','varbinary(max)') AS VARCHAR(100));
    

    结果清楚地表明,这是一个 JPEG(以FFD8 开头)。 VARBINARY(MAX) 的大小应该足够了...

    0xFFD8FFE2021C4943435F50524F46494C4500010100    
    ÿØÿâICC_PROFILE
    

    varchar 的(毫无意义的)演员向我们展示了一些 EXIF 数据...

    【讨论】:

      猜你喜欢
      • 2023-03-07
      • 2014-08-05
      • 1970-01-01
      • 2021-11-30
      • 2012-03-05
      • 1970-01-01
      • 1970-01-01
      • 2015-07-11
      • 1970-01-01
      相关资源
      最近更新 更多