适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
本文介绍了 FOR XML 子句如何处理无效的 XML 字符,并列出了在 XML 名称中无效的字符的转义规则。
FOR XML 与无效字符
不使用 TYPE 指令的 FOR XML 查询中返回无效 XML 字符时,SQL Server 便会对这些字符进行实体化。
尽管 XML 1.0 一致性分析器不管这些字符是否被实体化都会生成分析错误,但是经过实体化的格式更符合 XML 1.1。 经过实体化的格式还可能更符合未来版本的 XML 标准。 此外,它使得调试变得更加简单,因为无效字符的码位将变为可见的。
对于 XML 工具的用户,不需要任何解决方法,因为无论怎样,在数据流中出现无效字符的位置,XML 分析器都将失败。 如果您使用非 XML 工具,则这种变化可能需要您更新编程逻辑以便将这些字符作为实体化后的值来搜索。
在 FOR XML 查询中以不同的方式来实体化下列空格字符,以使它们在整个往返中都存在:
在元素内容和属性中:
hex(0D)
(回车)在属性内容中:
hex(09)
(Tab)、hex(0A)
(换行符)
输出中将保留这些字符,并且分析器将不再对它们进行规范。
转义规则
SQL Server 名称如果包含空格等在 XML 名称中无效的字符,则会以无效字符将被转化为转义后的数值实体编码的方式,将这些名称转换成 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_
。 如果处在 SQL Server 2000 后向兼容模式下,则HHHHHHHH
代表该字符对应的八位十六进制 UCS-4 编码。 否则会将字符编码为_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 命名空间。