【问题标题】:SQL Server XML DataType butchers my CDATA SectionSQL Server XML DataType 屠宰了我的 CDATA 部分
【发布时间】:2021-04-05 14:20:06
【问题描述】:

我有一个表,其中一列的数据类型为 XML

CREATE TABLE Employee
(
  ID INT,
  Name VARCHAR(200),
  ExtraInfo XML
)

我必须为 ExtraInfo 列使用 XML 数据类型,并且我有以下 INSERT 语句

INSERT INTO Employee
VALUES 
(1, 'John Doe', 
CONVERT(XML, '<root><section><![CDATA[Some weird content with weird characters (*&#^@$]]></section></root>'))

上面的语句执行完后,我在ExtraInfo栏目中得到了如下结果。

<root>
  <section>Some weird content with weird characters (*&amp;#^@$</section>
</root>

如何保持我的CDATA 部分完好无损?

我已经检查了other related question,这不是我想要的。

【问题讨论】:

  • 您的 CREATE TABLE 语句需要使用 括号 (CREATE TABLE (......)) - 而不是花括号 ({ ... }) 才能成为有效的 T-SQL 代码...
  • 这是预期行为 - 由于 xml 准则,某些字符被转义
  • 进一步详细说明 - 将 xml 数据类型更改为字符串并执行相同的插入,你会明白我的意思。
  • @DougCoats 这些关于 CDATA 转义子句的准则是否在某处规定了?我查了 MSDN,一无所获。
  • 您无法在这方面调整 SQL Server 的 XML 编码行为。如果需要,您唯一能做的就是将数据存储为NVARCHAR(MAX)——但是使用 XML 方法对其进行的任何操作都将导致 CDATA 再次被重新编码。请注意,您在此处获得的标记是等价的(如果您使用.value 查询section 的内容,您将得到正确的数据)即使它不是相同.

标签: sql-server sqlxml


【解决方案1】:

我实际上是在寻找来自 Microsoft 的东西,说明 XML 数据类型不支持 CDATA 部分。

这里是:How to get [CDATA] with FOR XML PATH?

引用 Microsoft 负责 SQL Server 中大部分 XML 内容的 Michael Rys 的话:

XML 数据类型不保留 CDATA 部分...它是 W3C XQuery 建议它不保留 CDATA 部分。

【讨论】:

    猜你喜欢
    • 2014-05-30
    • 1970-01-01
    • 2016-11-24
    • 1970-01-01
    • 2014-11-06
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多