Как написать файл xml, включая объявление с t- sql - PullRequest
0 голосов
/ 01 марта 2020

SQL Сервер 2017 Express - Я хочу экспортировать xml данные из базы данных в файл something.xml. Я могу запросить данные и записать данные в текстовый файл. Единственное, чего не хватает, - это объявления.

Что бы я ни делал, объявление удаляется мгновенно, и результатом всегда являются только данные XML. Это топи c было сказано до смерти из того, что я видел. Но всем ответам уже несколько лет. Есть ли шанс сделать экспорт данных XML из T- SQL (без C#, без VB, без Javascript, без каких-либо данных), включая строку объявления XML на данный момент?

1 Ответ

0 голосов
/ 02 марта 2020

Самый важный вопрос: зачем вам декларация?

Важно знать: эта декларация не является обязательной частью XML, но подсказывает потребителю, как читать контент .

В большинстве случаев это объявление сообщает потребителю о кодировке текстового файла. Существуют миллионы XML файлов, которые выкрикивают encoding="utf8" или что-то в этом роде, но на самом деле это файл utf16, обычный ASCII или любая другая кодировка. Если декларация не говорит правду, лучше вообще не иметь такой декларации ...

В пределах SQL -Сервер есть три варианта хранения XML (не говоря уже о * 1009). * или устаревший text здесь): Лучшее - native XML, в котором используется скрытая таблица иерархии nvarchar, и (неправильный выбор, но) часто встречающийся столбец на основе строки, основанный на одной из двух строк типы. Вы должны знать, что SQL -Server может иметь дело с (var)char(x) (что является расширенной сортировкой ASCII ), и с n(var)char(x), который является UCS-2 (почти таким же, как utf16) ,

Какая польза от хранения XML с объявлением в таком сценарии? SQL -Сервер может принимать кодировку непосредственно от типа, используемого для хранения. На уровне строк вы можете хранить буквально все что угодно, даже недопустимое / не правильно сформированное XML. Но в тот момент, когда вы вводите тип native XML, SQL -Server пропустит любое объявление и откажется от нарушения правил XML.

Для ответа на ваш вопрос

Единственный шанс добавить объявление, если оно вам действительно нужно, - преобразовать XML в строковый тип и добавить объявление на строковом уровне.

Имейте в виду, что

  • вы не можете перенести это обратно в native XML без потери объявления.
  • Если вы указали какую-либо кодировку, вы должны убедиться, что записанный целевой файл не является лжец.

Несколько лет go У меня возник тот же вопрос (нужно было добавить подсказку таблицы стилей). Вы можете прочитать этот связанный вопрос (и хороший ответ от har07) . Мой собственный ответ там отражает конкретно <?xml blahblah ?>.

заключительные подсказки

Начиная с с v2019 есть встроенная поддержка utf-8 с некоторыми специальными параметрами сортировки и начиная с v2014SP2 была поддержка UTF-8 для BCP .

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

select [name] 
      ,[description]
      ,COLLATIONPROPERTY([name],'codepage') [codepage]
from sys.fn_helpcollations();

И - после этого - вы можете использовать что-то вроде this

<?xml version="1.0" encoding="windows-1252"?>

Для правильного отображения выбранной кодировки.

Общая подсказка: Использование строкового типа NVARCHAR(MAX) вместе с utf-16 работает (почти) в любом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...