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

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

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

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

  • тип экземпляров приведения строки;
  • Использование инструкции SELECT с предложением FOR XML .
  • использование постоянных назначений;
  • использование массовой загрузки.

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

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

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

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

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

Содержимое строки varbinary принимается за поток кодовых точек, который передается непосредственно синтаксическому XML-анализатору. Таким образом, XML-документ или фрагмент должен содержать встроенную отметку BOM или другие сведения о кодировании. Средство синтаксического анализа проверяет только поток, чтобы определить кодировку. Это означает, что кодируемый XML-код UTF-16 должен предоставлять BOM UTF-16, а экземпляр без 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, опубликованной консорциумом W3C. Это связано с тем, что средство синтаксического анализа XML в SQL Server распознает только ограниченное количество подмножеств DTD, как определено в XML 1.0. Дополнительные сведения о ограниченных подмножествах DTD, поддерживаемых в SQL Server, см. в разделе CAST и CONVERT.

По умолчанию средство синтаксического анализа XML удаляет незначительное пробелы при преобразовании строковых данных в XML, если один из следующих параметров имеет значение true:

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

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

Например:

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

Результирующий набор:

<root><child/></root>

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

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

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

Пример. Приведение строкового значения к типизированному 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

Предложение в инструкции FOR XML SELECT можно использовать для возврата результатов в формате XML. Например:

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 предложении, которое напрямую возвращает 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 Server ядро СУБД столбцов, переменных и выходных параметров. В коде клиентского приложения поставщик 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- с нетипизированным XML".

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

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

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

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