Поделиться через


Создание экземпляров 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:

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, которые не сохраняются при их хранении в базах данных.