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