我有这个查询,
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的错误吗?

在XML中是无效字符。
来自可扩展标记语言(XML)1.0(第五版)
字符::=#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
)
Msg9420,级别16,状态1,第1行XML解析:第1行,字符16,非法的xml字符
或者,当您指定type
指令时,该列将是一个XML列,并且您会得到一个更详细的错误。
select cast(0x3 as char(1)) col
for xml raw, type
Msg 6841,级别16,状态1,行1 FOR XML无法序列化节点"col"的数据,因为它包含一个字符(0x0003)XML中不允许。要使用FOR XML检索此数据,请将其转换为二进制、varbinary或图像数据类型,并使用binary BASE64指令。
在生成XML之前,必须删除非法字符。
declare @XML xml =
replace((
select cast(0x3 as char(1)) col
for xml raw
), '', '')