San*_*hah 2 xml sql sql-server stored-procedures
illegal xml character将表记录解析为 xml 时出现错误。
SELECT \n mb.ProductTitle,mb.ProductDescription,\n CAST((\n SELECT\n Id, \n ProductDescription,\n FROM ProductsManagement AS mpm\n WHERE mpm.MattressId = 6\n FOR XML PATH('ProductItemListModel'), \n ROOT('MattressBarndProductItemList'))as XML)\nFROM Brands AS mb\nWHERE mb.Id = 6\nFOR XML PATH(''), ROOT('ProductModel')\nRun Code Online (Sandbox Code Playgroud)\n或者
\nSELECT CONVERT(XML,'lift')\nRun Code Online (Sandbox Code Playgroud)\n描述记录如下:
\n\n\nSealy 的 Ease\xe2\x84\xa2 可调节底座是让您的床变成完美放松场所的简单方法。无线遥控器控制头部和腿部抬起,几乎可以实现无限范围的人体工学姿势。”
\n
上面没有解析成xml。
\n这是因为XML 标准中有一个已知非法字符的列表。大多数情况下,这些字符甚至是不可见的,例如“终端铃声”或 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
Run Code Online (Sandbox Code Playgroud)
因此,调整后的查询将类似于:
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')
Run Code Online (Sandbox Code Playgroud)
另一种方法是与 VARBINARY 的对话,并在此链接主题中进行了描述: TSQL "Illegal XML Character" When Converting Varbinary to XML
| 归档时间: |
|
| 查看次数: |
11468 次 |
| 最近记录: |