Символ возврата каретки удален из XML с использованием OPENXML - PullRequest
4 голосов
/ 27 ноября 2011

Похоже, что SQL Server удаляет \r символов при синтаксическом анализе XML.Поэтому, когда моя хранимая процедура получает значения в xml для сохранения, все разрывы строк представляются в виде \n вместо \r\n.

Можно ли каким-либо образом заставить SQL Server не удалять символы \r?В приведенном ниже примере Node1 значение не содержит \r символов.


    DECLARE @hDoc int
    DECLARE @Xml nvarchar(MAX) 
    SET @Xml = N'<Root><Node1><![CDATA[' + nchar(13) + nchar(10) + N'Some ' + nchar(13) + nchar(10) + N' Value]]></Node1></Root>'
    EXEC sp_xml_preparedocument @hDoc OUTPUT, @Xml

    SELECT 
        Node1
        ,convert(varbinary(max),Node1) -- Contains 0A00 in the start instead of 0D0A,
        ,charindex(nchar(13),Node1)
    FROM
        OPENXML(@hDoc, N'/Root', 2) WITH (Node1 NVARCHAR(MAX))

    EXEC sp_xml_removedocument @hDoc

Вывод:
enter image description here

@ PJB предложил использовать XQuery узлы вместо.Но это не помогает.Я попытался выполнить запрос ниже и получил тот же результат.


    DECLARE @xml xml
    SET @xml = convert(xml, N'<Root><Node1><![CDATA[' + nchar(13) + nchar(10) + N'Some ' + nchar(13) + nchar(10) + N' Value]]></Node1></Root>')

    declare @Node1 nvarchar(30)
    select @Node1 = node.value('.', 'nvarchar(30)')
    from @xml.nodes('/Root/Node1') as doc(node)

    SELECT 
        @Node1
        ,convert(varbinary(max),@Node1) -- Contains 0A00 in the start instead of 0D0A,
        ,charindex(nchar(13),@Node1)

1 Ответ

3 голосов
/ 27 ноября 2011

Символ возврата каретки удален из XML

Это правильное поведение в соответствии со спецификацией XML для Обработка конца строки .

процессор XML ДОЛЖЕН вести себя так, как будто он нормализует все разрывы строк в внешние проанализированные объекты (включая сущность документа) на входе, перед синтаксическим анализом путем перевода двухсимвольной последовательности #xD #xA и любой #xD, за которым не следует #xA до одного символа #xA.

Вы можете попытаться использовать замену , чтобы вернуть возврат каретки.

select @Node1 = replace(node.value('.', 'nvarchar(30)'), nchar(10), nchar(13)+nchar(10))
from @xml.nodes('/Root/Node1') as doc(node)
...