添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

适用于: SQL Server Azure SQL数据库 Azure SQL 托管实例

本文介绍 FOR XML 子句如何处理无效 XML 字符,并列出了 XML 名称中无效字符的转义规则。

FOR XML 和无效字符

当在不使用 TYPE 指令的 FOR XML 查询中返回时,SQL Server将无效的 XML 字符实体化。

尽管 XML 1.0 一致性分析器不管这些字符是否被实体化都会生成分析错误,但是经过实体化的格式更符合 XML 1.1。 经过实体化的格式还可能更符合未来版本的 XML 标准。 此外,它使得调试变得更加简单,因为无效字符的码位将变为可见的。

对于 XML 工具的用户,不需要任何解决方法,因为无论怎样,在数据流中出现无效字符的位置,XML 分析器都将失败。 如果您使用非 XML 工具,则这种变化可能需要您更新编程逻辑以便将这些字符作为实体化后的值来搜索。

在 FOR XML 查询中以不同的方式来实体化下列空格字符,以使它们在整个往返中都存在:

  • 在元素内容和属性中: hex(0D) (回车)

  • 在属性内容中: hex(09) (选项卡) 、 hex(0A) (换行)

    这些字符保留在输出中,分析程序不会规范化它们。

    SQL Server 名称转换成了 XML 名称。

    XML 名称中只能出现两个非字母字符:冒号 () : 和下划线 ( _ ) 。 由于冒号已经保留给命名空间,因此下划线被选作转义符。 以下是用于编码的转义规则:

  • 根据 XML 1.0 规范,任何不是有效 XML 名称字符的 UCS-2 字符将转义为 _xHHHH_ 。 表示 HHHH 字符的四位数十六进制 UCS-2 代码(按最高有效位优先顺序)。 例如,表名称 Order Details 编码为 Order_x0020_Details

  • 不符合 UCS-2 领域的字符 (U+00010000 到 U+0010FFFF) 的 UCS-4 添加范围编码为 _xHHHHHHHH_ 。 表示 HHHHHHHH 字符的八位数十六进制 UCS-4 编码(如果在 SQL Server 2000 向后兼容模式下)。 否则,字符将编码为 _xHHHHHH_ ,以便与 ISO 标准保持一致。

  • 下划线字符不必转义,除非后跟字符 x 。 例如,表名称 Order_Details 未编码。

  • 标识符中的冒号不会转义。 因此,命名空间元素和属性名称可由 FOR XML 查询生成。 例如,下面的查询将生成其名称中包含冒号的命名空间属性:

    SELECT 'namespace-urn' as 'xmlns:namespace',
     1 as 'namespace:a'
    FOR XML RAW;
    

    此查询产生以下结果:

    <row xmlns:namespace="namespace-urn" namespace:a="1"/>
    

    建议使用 WITH XMLNAMESPACES 添加 XML 命名空间。

  • FOR XML (SQL Server)
  •