我有这个查询,
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')
)
这会引发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')
它显示以下xml,
<root>
..............................................
..............................................
<PD>
<ID>4187</ID>
<ProductID>23</ProductID>
<Header>aa</Header>
<Description>with other</Description>
<Order>7</Order>
<LanguageID>1</LanguageID>
</PD>
请注意#x3 。在我的应用程序中,它只是一个空间。这是SQL Server的错误吗?
答案 0 :(得分:8)

是XML中的无效字符。
来自Extensible Markup Language (XML) 1.0 (Fifth Edition)
Char :: =#x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
您的查询可以简化为:
select cast(0x3 as char(1)) col
for xml raw
上述查询的输出是一个包含一行和一列且数据类型为nvarchar(max)
的列的表。
分配给XML变量时会出错。
declare @XML xml =
(
select cast(0x3 as char(1)) col
for xml raw
)
Msg 9420,Level 16,State 1,Line 1 XML解析:第1行,第16个字符, 非法的xml字符
或者,当您指定type
指令时,该列将成为XML列,您会收到更详细的错误。
select cast(0x3 as char(1)) col
for xml raw, type
Msg 6841,Level 16,State 1,Line 1 FOR XML无法序列化 节点&#39; col&#39;的数据因为它包含一个字符(0x0003) 不允许使用XML。要使用FOR XML检索此数据,请将其转换为 binary,varbinary或image数据类型并使用BINARY BASE64 指令。
在生成XML之前,您必须删除非法字符。
declare @XML xml =
replace((
select cast(0x3 as char(1)) col
for xml raw
), '', '')