SQL Server 2008 - добавление декларации XML к выводу XML - PullRequest
10 голосов
/ 15 ноября 2010

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

 SELECT (
   SELECT CONVERT(VARCHAR(10),GETDATE(),103)
   FOR XML PATH('DataVersion'), 
     TYPE
   ),
   (  
   SELECT CoNum,
     CoName,
     CONVERT(VARCHAR(10),AccountToDate,103) 'DLA',
     LAFileNet
   FROM @XMLOutput  
   FOR XML PATH('Company'),
     TYPE  
   )
 FOR XML PATH(''),
   ROOT('Companies')

, который создает следующий вывод

<Companies>
  <DataVersion>15/11/2010</DataVersion>
  <Company>
    <CoNum>111</CoNum>
    <CoName>ABCLmt</CoName>
    <DLA>12/12/2010</DLA>
    <LAFileNet>1234</LAFileNet>
  </Company>
  <Company>
    <CoNum>222</CoNum>
    <CoName>DEFLmt</CoName>
    <DLA>12/12/2007</DLA>
    <LAFileNet>5678</LAFileNet>
  </Company>
</Companies>

С чем я борюсь, это как добавить объявление XML <?xml version="1.0" encoding="ISO-8859-1" ?> в начало вывода ??

Обновление 1: Правильно ли я считаю, что мне нужно создать схему XML на сервере SQL для определения вывода xsl: Затем назначить вывод этой схемы?

Обновление 2: с тех пор нашли эти ссылки http://forums.asp.net/t/1455808.aspx - Проверьте комментарий от Цзянь Кан. Также http://www.devnewsgroups.net/group/microsoft.public.sqlserver.xml/topic60022.aspx

Ответы [ 2 ]

7 голосов
/ 24 апреля 2014

TL; DR

Объедините это: <?xml version="1.0" encoding="windows-1252" ?> с вашим XML, преобразованным в varchar (max).

Подробнее

Я согласен с j0N45 , что схема ничего не изменит. Как ответ, на который он ссылается указывает:

Вы должны добавить его вручную.

Я предоставил пример кода для этого в другом ответе . По сути, вы CONVERT XML в varchar или nvarchar и затем объединяете его с декларацией XML, такой как <?xml version="1.0" encoding="windows-1252" ?>.

Однако важно выбрать правильную кодировку. SQL Server генерирует строки, отличные от Юникода, в соответствии со своими параметрами сортировки. По умолчанию это будет регулироваться параметрами сортировки базы данных, которые можно определить с помощью этого SQL:

SELECT DATABASEPROPERTYEX('ExampleDatabaseName', 'Collation');

Стандартное сопоставление по умолчанию - это "SQL_Latin1_General_CP1_CI_AS", кодовая страница которого 1252. Вы можете получить кодовую страницу с помощью этого SQL:

SELECT COLLATIONPROPERTY('SQL_Latin1_General_CP1_CI_AS', 'CodePage') AS 'CodePage';

Для кодовой страницы 1252 следует использовать кодовое имя « windows-1252 ». Использование «ISO-8859-1» является неточным. Вы можете проверить это с помощью символа «bullet»: •. Он имеет значение кодовой точки Unicode 8226 (Hex 2022). Вы можете надежно сгенерировать символ в SQL независимо от параметров сортировки, используя этот код:

SELECT NCHAR(8226);

У него также есть кодовая точка 149 в кодовой странице windows-1252, поэтому, если вы используете стандартное сопоставление по умолчанию «SQL_Latin1_General_CP1_CI_AS», вы также можете создать его с помощью:

SELECT CHAR(149);

Однако CHAR (149) не будет пулей во всех сопоставлениях. Например, если вы попробуете это:

SELECT CONVERT(char(1),char(149)) COLLATE Chinese_Hong_Kong_Stroke_90_BIN;

Вы вообще не получите пулю.

Кодовая страница ISO-8859-1 - Windows-28591 . Ни одно из сопоставлений SQL Server (в любом случае в 2005 году) не использует эту кодовую страницу. Вы можете получить полный список кодовых страниц, используя:

SELECT [Name], [Description], [CodePage] = COLLATIONPROPERTY([Name], 'CodePage')
FROM ::fn_helpcollations()
ORDER BY [CodePage] DESC;

Вы также можете проверить, что «ISO-8859-1» является неправильным выбором, попытавшись использовать его в самом SQL. Следующий SQL:

SELECT CONVERT(xml,'<?xml version="1.0" encoding="ISO-8859-1"?><test>•</test>');

Будет генерировать XML, который не содержит маркера. На самом деле, он не будет производить никаких символов, потому что ISO-8859-1 не имеет символов, определенных для кодовой точки 149.

SQL Server по-разному обрабатывает строки Unicode. Для строк Unicode (nvarchar), «нет необходимости в разных кодовых страницах для обработки разных наборов символов» . Однако SQL Server НЕ использует кодировку «UTF-8». Если вы попытаетесь использовать его внутри самого SQL:

SELECT CONVERT(xml,N'<?xml version="1.0" encoding="UTF-8"?><test>•</test>');

Вы получите ошибку:

Сообщение 9402, уровень 16, состояние 1, строка 1 Синтаксический анализ XML: строка 1, символ 38, невозможно переключить кодировку

Скорее, SQL использует кодировку "UCS-2", так что это будет работать:

SELECT CONVERT(xml,N'<?xml version="1.0" encoding="UCS-2"?><test>•</test>');
1 голос
/ 06 августа 2012

Я думаю, что это ответ на ваш вопрос Как добавить кодировку xml <? Xml version = "1.0" encoding = "UTF-8"?> В вывод XML в SQL Server .

Я не думаю, что создание схемы что-либо изменит, потому что она используется только для проверки.

Приветствия

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