Создание экземпляров XML-данных

Применяется к:SQL ServerAzure SQL DatabaseAzure, управляемому экземпляру SQL Azure

В этой статье описывается, как создавать экземпляры XML.

В SQL Server экземпляры XML можно создавать следующим образом:

  • тип экземпляров приведения строки;

  • использование инструкции SELECT с предложением FOR XML;

  • использование постоянных назначений;

  • использование массовой загрузки.

Тип приведения строк и двоичных экземпляров

Вы можете проанализировать любой из типов строковых данных SQL Server, таких как [n][var]char, [n]text, varbinary и image, в тип данных XML путем приведения (CAST) или преобразования (CONVERT) строки в тип данных XML. Нетипизированный XML проверяется, чтобы убедиться, что он хорошо сформирован. При наличии схемы, связанной с типом XML , также выполняется проверка. Дополнительные сведения см. в статье Сравнение типизированного и нетипизированного XML.

XML-документы могут использовать разные кодировки (например, UTF-8, UTF-16, Windows-1252). Следующие правила дают сведения о том, как строка и двоичный источник взаимодействуют с кодировкой XML-документа, и как ведет себя синтаксический анализатор.

Так как тип nvarchar предполагает двухбайтовую кодировку Юникод, например UTF-16 или UCS-2, синтаксический XML-анализатор сочтет значение строки за XML-документ или фрагмент в двухбайтовой кодировке Юникод. Это значит, что XML-документ должен быть закодирован в двухбайтовой кодировке Юникод, а также совмещен с типом данных источника. Xml-документ в кодировке UTF-16 может иметь знак порядка байтов UTF-16 (BOM), но не требуется, так как контекст исходного типа дает понять, что он может быть только документом в кодировке Юникод с двумя байтами.

Содержимое строки varchar синтаксический XML-анализатор принимает за однобайтовый XML-документ/фрагмент. Так как строка источника varchar имеет связанную кодовую страницу, синтаксический анализатор будет использовать эту кодовую страницу для кодирования, если явно не была указана кодировка в самом XML. Если XML-экземпляр имеет отметку BOM или декларацию кодирования, отметка BOM или декларация должна быть согласована с кодовой страницей, иначе синтаксический анализатор выдаст ошибку.

Содержимое строки varbinary принимается за поток кодовых точек, который передается непосредственно синтаксическому XML-анализатору. Таким образом, XML-документ или фрагмент должен содержать встроенную отметку BOM или другие сведения о кодировании. Чтобы определить кодировку, синтаксическому анализатору достаточно будет просто просмотреть поток. Это значит, что XML в кодировке UTF-16 должен содержать отметку UTF-16 BOM, а экземпляр без отметки BOM и без декларации о кодировании будет интерпретироваться как UTF-8.

Если кодировка XML-документа не известна заранее, а данные передаются как строковые или двоичные данные вместо XML-данных перед приведением к XML, рекомендуется рассматривать данные как varbinary. Например, при чтении данных из XML-файла с помощью OpenRowset()следует указать данные, которые следует считать как значение varbinary(max ):

SELECT CAST(x AS XML);
FROM OpenRowset(BULK 'filename.xml', SINGLE_BLOB) R(x);

SQL Server внутренне представляет XML в эффективном двоичном представлении, использующее кодировку UTF-16. Кодирование, предоставленное пользователем, не сохраняется, но считается во время процесса синтаксического анализа.

Тип приведения определяемых пользователем типов CLR

Если определяемый пользователем тип данных CLR имеет XML-сериализацию, экземпляры этого типа могут быть явно приведены к типу данных XML. Дополнительные сведения о сериализации XML определяемого пользователем типа СРЕДЫ CLR см. в статье о сериализации XML из объектов базы данных CLR.

Обработка пробелов в типизированном XML

В SQL Server пробелы внутри содержимого элемента считаются незначительными, если они происходят внутри последовательности символьных данных только пробелов, разделенных разметкой, например начальными или конечными тегами, и не идентицируются. (секции CDATA игнорируются). Данная обработка пробела отличается от пробела, описанного в спецификации XML 1.0, опубликованной консорциумом World Wide Web (W3C). Это связано с тем, что средство синтаксического анализа XML в SQL Server распознает только ограниченное количество подмножеств DTD, как определено в XML 1.0. Дополнительные сведения о ограниченных подмножествах DTD, поддерживаемых в SQL Server, см. в разделе CAST и CONVERT (Transact-SQL).

Синтаксический XML-анализатор отменяет незначащие пробелы при преобразовании строковых данных в XML по умолчанию, если выполняется одно из следующих условий:

  • Атрибут xml:space не определен для элемента или его предки элементов.

  • атрибут xml:space , действующий на элемент или на одного из его родителей, имеет значение по умолчанию.

Например:

DECLARE @x XML;
SET @x = '<root>      <child/>     </root>';
SELECT @x;

Результат:

<root><child/></root>

Однако можно изменить это поведение. Чтобы сохранить пробел для экземпляра xml DT, необходимо использовать оператор CONVERT и его дополнительный параметр style , установленный в значение 1. Например:

SELECT CONVERT(xml, N'<root>      <child/>     </root>', 1);

Если параметр стиля не используется или его значение равно 0, для преобразования экземпляра XML DT не сохраняется незначительное пробел. Дополнительные сведения об использовании оператора CONVERT и его параметра стиля при преобразовании строковых данных в экземпляры XML DT см. в разделе CAST и CONVERT (Transact-SQL).

Пример. Приведение строкового значения к типизированному XML-файлу и назначение его столбцу

Следующий пример приводит строковую переменную, содержащую фрагмент XML, в тип данных xml и затем сохраняет его в xml -столбец:

CREATE TABLE T(c1 int primary key, c2 xml);
GO
DECLARE  @s VARCHAR(100);
SET @s = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>';

Следующая операция вставки неявно преобразовывает строку в тип xml :

INSERT INTO T VALUES (3, @s);

Вы можете явным образом cast() использовать строку для типа XML :

INSERT INTO T VALUES (3, CAST(@s AS XML));

Или можно использовать convert(), как показано в следующем примере:

INSERT INTO T VALUES (3, CONVERT(XML, @s));

Пример. Преобразование строки в типизированный XML и назначение его переменной

В следующем примере строка преобразовывается в тип xml и присваивается переменной типа xml :

DECLARE @x XML;
DECLARE  @s VARCHAR(100);
SET @s = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>';
SET @x = CONVERT(XML, @s);
SELECT @x;

Использование инструкции SELECT с предложением FOR XML

Чтобы получить результаты в виде XML, можно использовать предложение FOR XML в инструкции SELECT. Например:

DECLARE @xmlDoc XML;
SET @xmlDoc = (SELECT Column1, Column2
               FROM   Table1, Table2
               WHERE  <some condition>
               FOR XML AUTO)
...;

Инструкция SELECT возвращает текстовый XML-фрагмент, который затем анализируется в процессе присвоения переменной типа xml .

Также можно использовать директиву TYPE в предложении FOR XML, которая непосредственно возвращает результат запроса FOR XML в виде xml -данных:

DECLARE @xmlDoc XML;
SET @xmlDoc = (SELECT ProductModelID, Name
               FROM   Production.ProductModel
               WHERE  ProductModelID = 19
               FOR XML AUTO, TYPE);
SELECT @xmlDoc;

Результат:

<Production.ProductModel ProductModelID="19" Name="Mountain-100" />...

В следующем примере типизированный результат xml -запроса FOR XML вставляется в xml -столбец:

CREATE TABLE T1 (c1 int, c2 xml);
GO
INSERT T1(c1, c2)
SELECT 1, (SELECT ProductModelID, Name
           FROM Production.ProductModel
           WHERE ProductModelID = 19
           FOR XML AUTO, TYPE);
SELECT * FROM T1;
GO

Дополнительные сведения о FOR XML см. в разделе FOR XML (SQL Server).

Заметка

SQL Server возвращает экземпляры xml-типа данных клиенту в результате различных конструкций сервера, таких как ЗАПРОСы FOR XML, использующие директиву TYPE, или где тип данных XML используется для возврата XML из столбцов SQL, переменных и выходных параметров. В коде клиентского приложения поставщик ADO.NET требует, чтобы информация типа данных xml отправлялась сервером в двоичном представлении. Однако в запросах FOR XML без директивы TYPE XML-данные возвращаются в строковом формате. В любом случае поставщик клиента всегда будет иметь возможность обрабатывать XML-данные в любом из форматов.

Использование назначений констант

Строковая константа может быть использована там, где ожидается экземпляр xml -типа. Это то же самое, что и неявное приведение (CAST) строки в XML. Например:

DECLARE @xmlDoc XML;
SET @xmlDoc = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>';
-- Or
SET @xmlDoc = N'<?xml version="1.0" encoding="ucs-2"?><doc/>';

Предыдущий пример неявно преобразовывает строку в тип xml и присваивает его xml -переменной.

Следующий пример вставляет строковую константу в xml -столбец:

CREATE TABLE T(c1 INT PRIMARY KEY, c2 XML);
INSERT INTO T VALUES (3, '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>');

Заметка

Для типизированного XML подлинность XML проверяется в отношении указанной схемы. Дополнительные сведения см. в статье Сравнение типизированного и нетипизированного XML.

Использование массовой загрузки

Улучшенная функциональность OPENROWSET (Transact-SQL) позволяет произвести массовую загрузку XML-документов в базу данных. Можно выполнить массовую загрузку XML-экземпляров из файлов в xml -столбец базы данных. Примеры работы см. в примерах массового импорта и экспорта XML-документов (SQL Server). Дополнительные сведения о загрузке XML-документов см. в статье Загрузка XML-данных.

В этом разделе

Статья Description
Получение и запрос данных XML Описывает части экземпляров XML, которые не сохраняются при их хранении в базах данных.

См. также