SQL Server XML DataType уничтожает мой раздел CDATA

У меня есть таблица с одним столбцом с типом данных XML.

CREATE TABLE Employee
(
  ID INT,
  Name VARCHAR(200),
  ExtraInfo XML
)

Я должен использовать тип данных XML для столбца ExtraInfo, и у меня есть следующая инструкция INSERT

INSERT INTO Employee
VALUES 
(1, 'John Doe', 
CONVERT(XML, '<root><section><![CDATA[Some weird content with weird characters (*&#^@$]]></section></root>'))

После выполнения приведенного выше оператора я получаю следующее в столбце ExtraInfo.

<root>
  <section>Some weird content with weird characters (*&amp;#^@$</section>
</root>

Как сохранить раздел CDATA нетронутым?

Я уже проверил другой связанный вопрос, это не совсем то, что Я ищу.


person fahadash    schedule 05.04.2021    source источник
comment
В вашем операторе CREATE TABLE должны использоваться круглые скобки (CREATE TABLE (......)), а не фигурные скобки ( { ... }), чтобы он был действительным кодом T-SQL...   -  person marc_s    schedule 05.04.2021
comment
это ожидаемое поведение - некоторые символы экранируются из-за правил xml   -  person Doug Coats    schedule 05.04.2021
comment
чтобы уточнить - измените тип данных xml на строку и выполните ту же вставку, и вы поймете, что я имею в виду.   -  person Doug Coats    schedule 05.04.2021
comment
@DougCoats Оговорены ли где-нибудь эти рекомендации с этим пунктом об экранировании CDATA? Я искал MSDN и ничего не нашел.   -  person fahadash    schedule 05.04.2021
comment
Вы не можете настроить поведение XML-кодирования SQL Server в этом отношении. Если вам это нужно, единственное, что вы можете сделать, это сохранить данные как NVARCHAR(MAX), но любая операция с ними с помощью методов XML приведет к повторной перекодировке CDATA. Обратите внимание, что полученная здесь разметка эквивалентна (если вы запросите содержимое section с помощью .value, вы получите правильные данные), даже если она не идентична.   -  person Jeroen Mostert    schedule 05.04.2021
comment
@fahadash advancedinstaller.com/user-guide/xml-escaped-chars. html   -  person Doug Coats    schedule 05.04.2021
comment
@DougCoats Спасибо, что связали меня со страницей экранированных символов XML. На самом деле я искал что-то от Microsoft, утверждающее, что тип данных XML не поддерживает разделы CDATA.   -  person fahadash    schedule 05.04.2021


Ответы (1)


На самом деле я искал что-то от Microsoft, утверждающее, что тип данных XML не поддерживает разделы CDATA.

Вот он: Как получить [CDATA] с FOR XML PATH?

Цитата Майкла Риса, который отвечал за большую часть XML-материалов в SQL Server в Microsoft:

Тип данных XML не сохраняет разделы CDATA... это часть рекомендации W3C XQuery, согласно которой он не сохраняет раздел CDATA.

person Mikael Eriksson    schedule 13.04.2021