将表记录解析为xml时遇到illegal xml character
错误。
SELECT
mb.ProductTitle,mb.ProductDescription,
CAST((
SELECT
Id,
ProductDescription,
FROM ProductsManagement AS mpm
WHERE mpm.MattressId = 6
FOR XML PATH('ProductItemListModel'), ROOT('MattressBarndProductItemList'))as XML)
FROM Brands AS mb
WHERE mb.Id = 6
FOR XML PATH(''), ROOT('ProductModel')
或
SELECT CONVERT(XML,'lift')
描述记录如下:
Ease™by Sealy可调式底座是将您的床变成放松的理想场所的简单方法。无线遥控器可控制头部和腿部抬高,几乎无限范围地符合人体工程学。”
上面没有解析为xml。
答案 0 :(得分:2)
这是因为XML标准中存在已知的illegal字符列表。通常,这些字符甚至都不可见,例如“终端铃”或CHAR(7)。此类字符以及列表中的其他字符会导致您现在遇到该错误。
可用的解决方法很少,但是所有解决方法都是关于删除非法字符的。
下面的示例基于标量函数方法,因此警告::它可能对大量数据执行缓慢:
CREATE FUNCTION [dbo].RemoveInvalidXMLCharacters (@InputString VARCHAR(MAX))
RETURNS VARCHAR(MAX)
AS
BEGIN
IF @InputString IS NOT NULL
BEGIN
DECLARE @Counter INT, @TestString NVARCHAR(40)
SET @TestString = '%[' + NCHAR(0) + NCHAR(1) + NCHAR(2) + NCHAR(3) + NCHAR(4) + NCHAR(5) + NCHAR(6) + NCHAR(7) + NCHAR(8) + NCHAR(11) + NCHAR(12) + NCHAR(14) + NCHAR(15) + NCHAR(16) + NCHAR(17) + NCHAR(18) + NCHAR(19) + NCHAR(20) + NCHAR(21) + NCHAR(22) + NCHAR(23) + NCHAR(24) + NCHAR(25) + NCHAR(26) + NCHAR(27) + NCHAR(28) + NCHAR(29) + NCHAR(30) + NCHAR(31) + ']%'
SELECT @Counter = PATINDEX (@TestString, @InputString COLLATE Latin1_General_BIN)
WHILE @Counter <> 0
BEGIN
SELECT @InputString = STUFF(@InputString, @Counter, 1, ' ')
SELECT @Counter = PATINDEX (@TestString, @InputString COLLATE Latin1_General_BIN)
END
END
RETURN(@InputString)
END
因此,调整后的查询将类似于:
SELECT
[dbo].RemoveInvalidXMLCharacter(smb.ProductTitle) as ProductTitle
, [dbo].RemoveInvalidXMLCharacter(mb.ProductDescription) as ProductDescription
, CAST((
SELECT
Id,
[dbo].RemoveInvalidXMLCharacter(ProductDescription) ProductDescription
FROM ProductsManagement AS mpm
WHERE mpm.MattressId = 6
FOR XML PATH('ProductItemListModel'), ROOT('MattressBarndProductItemList'))as XML)
FROM Brands AS mb
WHERE mb.Id = 6
FOR XML PATH(''), ROOT('ProductModel')
另一种方法是与VARBINARY的对话,并且在此链接的主题中也有介绍: Invalid Characters in XML