Как добавить кодировку XMLв XML-вывод в SQL Server - PullRequest
19 голосов
/ 25 января 2012

Вероятно, дубликат без ответа. SQL Server 2008 - добавление декларации XML к выводу XML

Пожалуйста, дайте мне знать, если это возможно. Я читаю в некоторых блогах

http://forums.asp.net/t/1455808.aspx/1

http://www.devnewsgroups.net/group/microsoft.public.sqlserver.xml/topic60022.aspx

Но я не мог понять, почему я не могу этого сделать.

Ответы [ 4 ]

36 голосов
/ 25 января 2012

Вы должны добавить его вручную.SQL Server всегда хранит XML внутри себя как ucs-2, поэтому для SQL невозможно сгенерировать его заголовок кодировки utf-8

См. «Ограничения типа данных xml» в MSDN

Объявление XML PI, например, <?xml version='1.0'?>, не сохраняется при хранении данных XML в экземпляре типа данных xml.Это по замыслу.Объявление XML (<?xml ... ?>) и его атрибуты (версия / кодировка / автономные) теряются после преобразования данных в тип xml.Декларация XML рассматривается как директива для синтаксического анализатора XML.Данные XML хранятся внутри как ucs-2.

5 голосов
/ 25 января 2014

Когда я прочитал этот пост, я подумал, что это «конец строки» ... нет решения ... Я почти разочаровался в подходе ... но на самом деле есть способ обойти это ограничение, преобразование XML в varchar (max), а затем добавление объявления в начало строки. Следующий пост показывает, как:

Использование SQL Server "FOR XML": преобразовать тип данных результата в текст / varchar / string, как?

Простой пример будет выглядеть примерно так:

SELECT 'MY DATA' As MyColumn INTO #MyTable 
SELECT '<?xml version="1.0" encoding="UTF-8"?>' + 
CAST((SELECT MyColumn FROM #MyTable FOR XML PATH('')) AS VARCHAR(MAX)) AS XmlData
DROP TABLE #MyTable 

Выход:

<?xml version="1.0" encoding="UTF-8"?>
<MyColumn>MY DATA</MyColumn>
2 голосов
/ 05 декабря 2018

Принятый ответ «добавить его вручную», хотя технически правильный, неполон и, следовательно, вводит в заблуждение. Простое добавление объявления XML с любой «кодировкой», которую вы хотите, не меняет фактическую кодировку строки. Это иногда хорошо. Если указать «UTF-8» и преобразовать данные XML в VARCHAR, тогда, если все символов являются стандартными символами ASCII (значения 1–127), то, конечно же, это UTF -8 (по крайней мере, заметной разницы нет). НО, если есть любые символов со значениями 128 или выше, то у вас не есть XML-документ в кодировке UTF-8. А если вы преобразуете данные XML в NVARCHAR, то у вас будет документ в кодировке UTF-16, независимо от того, что вы вручную указали в объявлении XML. Вы должны указывать только кодировку, ЕСЛИ это фактическая используемая кодировка.

И до SQL Server 2019 (в настоящее время в бета-версии на CTP 2.1) не было никакого способа получить кодировку UTF-8 в SQL Server, по крайней мере, без использования SQLCLR. Но в SQL Server 2019 теперь вы можете конвертировать XML в фактический UTF-8:

DECLARE @XML XML;
SET @XML = N'<test attr="&#x1F60E;"/>';
SELECT @XML,
       CONVERT(VARBINARY(100), CONVERT(NVARCHAR(MAX), @XML)), -- UTF-16 / UCS-2
       CONVERT(VARBINARY(100),
               CONVERT(VARCHAR(MAX),
                       CONVERT(NVARCHAR(MAX), @XML) COLLATE Latin1_General_100_CI_AS_SC_UTF8)
              ); -- UTF-8

Возвращает:

Column 1: <test attr="?" />
Column 2: 0x3C007400650073007400200061007400740072003D0022003DD80EDE22002F003E00
Column 3: 0x3C7465737420617474723D223F3F222F3E

Поскольку многие люди еще не будут на SQL Server 2019 некоторое время, это возможно через SQLCLR. Вы можете использовать классы .NET Xml (например, XmlWriter), чтобы экспортировать их с различными вариантами. Фактически, я создал библиотеку функций SQLCLR, SQL # , которая включает такую ​​функцию: XML_SaveToFile . Функция XML_SaveToFile позволяет указать любую допустимую кодировку, и она одновременно задает это в объявлении XML и обеспечивает сохранение файла с этой кодировкой. У него также есть опции для отступов, перехода на новую строку и т. Д. Просто к сведению: хотя в бесплатной версии доступно много функций, XML_SaveToFile доступен только в полной (платной) версии.

0 голосов
/ 01 августа 2016

Я работал над этим вопросом в течение последних дней, и, хотя могут быть и более эффективные решения, я был очень доволен этим скриптом bash:

iconv -f UCS-2 -t UTF-8 products.xml > products_utf8.xml
echo "<?xml version='1.0'?>\n<products>\n$(cat products_utf8.xml)\n</products>" > products_utf8_final.xml

По сути, этот скрипт получит файл, сгенерированный из ужасного программного обеспечения bcp, который генерирует неполные и недействительные данные XML, преобразует их из формата UCS-2 в UTF-8 (первая строка) и добавляет в начале и в конце файла, что ему нужно (вторая строка скрипта), чтобы быть действительным и полным.

Это работает для меня. Сценарий, который я использовал для создания файла XML с помощью BCP:

bcp.exe "select * from dat1.dbo.Products FOR XML AUTO,ELEMENTS” queryout "C:\products.xml" -T -w -r -S .\SQLEXPRESS
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...