Создание экземпляров XML-данных
Область применения: SQL Server База данных SQL Azure Управляемый экземпляр 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-данных.
В этом разделе
Статья | Описание |
---|---|
Получение и запрос данных XML | Описывает части экземпляров XML, которые не сохраняются при их хранении в базах данных. |
См. также
Кері байланыс
https://aka.ms/ContentUserFeedback.
Жақында қолжетімді болады: 2024 жыл бойы біз GitHub Issues жүйесін мазмұнға арналған кері байланыс механизмі ретінде біртіндеп қолданыстан шығарамыз және оны жаңа кері байланыс жүйесімен ауыстырамыз. Қосымша ақпаратты мұнда қараңыз:Жіберу және пікірді көру