奇怪错误XML解析:第1行,第2038字符,非法xml字符

use*_*567 6 sql t-sql sql-server sql-server-2008-r2

我有这个问题,

DECLARE @Result XML;
SELECT @Result = (  SELECT  PD.* 
                FROM    [ProductDetailedDescriptions] PD
                        LEFT JOIN [Products] P ON (PD.ProductID= P.ID)
                WHERE   PD.ProductID = 23
                        AND P.RetailerID = 1
                        AND PD.LanguageID = 1
                ORDER BY [ORDER]
                FOR XML AUTO, ELEMENTS, ROOT('root')
            )
Run Code Online (Sandbox Code Playgroud)

这引发了XML parsing: line 1, character 2038, illegal xml character.当我选择时,

SELECT  PD.* 
FROM    [ProductDetailedDescriptions] PD
        LEFT JOIN [Products] P ON (PD.ProductID= P.ID)
WHERE   PD.ProductID = 23
        AND P.RetailerID = 1
        AND PD.LanguageID = 1
ORDER BY [ORDER]
FOR XML AUTO, ELEMENTS, ROOT('root')
Run Code Online (Sandbox Code Playgroud)

它显示以下xml,

<root>
   ..............................................
   ..............................................
  <PD>
    <ID>4187</ID>
    <ProductID>23</ProductID>
    <Header>aa</Header>
    <Description>with &#x3;other</Description>
    <Order>7</Order>
    <LanguageID>1</LanguageID>
  </PD>
Run Code Online (Sandbox Code Playgroud)

注意#x3.在我的应用程序中,它只是一个空间.这是SQL Server的错误吗?

Mik*_*son 9

&#x03; 是XML中的无效字符.

来自可扩展标记语言(XML)1.0(第五版)

Char :: =#x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]

您的查询可以简化为:

select cast(0x3 as char(1)) col
for xml raw
Run Code Online (Sandbox Code Playgroud)

上述查询的输出是一个包含一行和一列数据类型的表nvarchar(max).

分配给XML变量时会出现错误.

declare @XML xml = 
(
  select cast(0x3 as char(1)) col
  for xml raw
)
Run Code Online (Sandbox Code Playgroud)

消息9420,级别16,状态1,行1 XML解析:第1行,字符16,非法xml字符

或者,当您指定该type指令时,该列将是一个XML列,您会得到更详细的错误.

select cast(0x3 as char(1)) col
for xml raw, type
Run Code Online (Sandbox Code Playgroud)

Msg 6841,Level 16,State 1,Line 1 FOR XML无法序列化节点'col'的数据,因为它包含XML中不允许的字符(0x0003).要使用FOR XML检索此数据,请将其转换为二进制,varbinary或图像数据类型,并使用BINARY BASE64指令.

在生成XML之前,必须删除非法字符.

declare @XML xml =
replace((
       select cast(0x3 as char(1)) col
       for xml raw
       ), '&#x03;', '')
Run Code Online (Sandbox Code Playgroud)