Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql server中XML解析非法字符_Sql_Sql Server_Xml_Stored Procedures - Fatal编程技术网

sql server中XML解析非法字符

sql server中XML解析非法字符,sql,sql-server,xml,stored-procedures,Sql,Sql Server,Xml,Stored Procedures,在将表记录解析为xml时,我遇到了一个非法xml字符错误 SELECT mb.ProductTitle,mb.ProductDescription, CAST(( SELECT Id, ProductDescription, FROM ProductsManagement AS mpm WHERE mpm.MattressId

在将表记录解析为xml时,我遇到了一个
非法xml字符
错误

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')

描述的记录如下:

缓和™ 通过Sealy可调底座是将您的床变成放松的完美场所的简单方法。无线遥控器控制头部和腿部的提升,几乎可以实现无限范围的人体工程学位置。”


上述内容未解析为xml。

这是因为xml标准中有一个已知字符列表。大多数字符甚至不可见,例如“terminal bell”或CHAR(7)。此类字符和列表中的其他字符将导致您现在遇到的错误

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')
有几个变通办法可用,但所有这些都是关于删除非法字符

以下示例基于标量函数方法,因此警告:它可能会对大量数据执行缓慢:

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
另一种方法是与VARBINARY的对话,也在本链接主题中进行了介绍:

您正试图使用此代码聚合字符串。在SQL Server 2017中,您可以使用STRING_AGG。在早期版本中,此技术用于执行相同的操作。非法XML字符是此技术的一个已知问题。因此,有关字符串聚合和字符串拆分的所有问题都直接或间接地使用来自的技术。使用SQLCLR函数是最快的技术,对无效字符没有任何问题。@PanagiotisKanavos,也许OP想要生成XML导出:)
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')