Извлечение XML-данных

В SQL Server сохраняется содержимое экземпляра XML, но не сохраняются его аспекты, которые в модели XML-данных не рассматриваются как значительные. Это означает, что полученный экземпляр XML может отличаться от экземпляра, сохраненного на сервере, но при этом будет содержать те же самые данные.

В этом разделе описаны части экземпляров XML, не сохраняемые при сохранении экземпляров в базах данных.

XML-декларация

XML-декларация экземпляра не сохраняется при сохранении экземпляра в базе данных. Например:

CREATE TABLE T1 (Col1 int primary key, Col2 xml)
GO
INSERT INTO T1 values (1, '<?xml version="1.0" encoding="windows-1252" ?><doc></doc>')
GO
SELECT Col2
FROM T1

Результат равен <doc/>.

XML-декларация, например <?xml version='1.0'?>, не сохраняется при сохранении XML-данных в экземпляре типа xml. Это сделано намеренно. XML-декларация (<?xml ... ?>) и ее атрибуты (version/encoding/stand-alone) будут утеряны после того, как данные преобразуются в тип xml. XML-декларация обрабатывается как директива для синтаксического анализатора XML. Все данные XML внутренне хранятся в кодировке UCS-2. Все другие инструкции по обработке (PI) в экземпляре XML сохраняются.

Порядок атрибутов

Порядок атрибутов экземпляра XML не сохраняется. При запросе экземпляра XML, хранящегося в столбце типа xml, порядок атрибутов в результирующем XML может отличаться от порядка в исходном экземпляре XML.

Кавычки вокруг значений атрибутов

Одинарные и двойные кавычки вокруг значений атрибутов не сохраняются. Значения атрибутов хранятся в базе данных в виде пар имени и значения. Кавычки не хранятся. При выполнении запроса XQuery к экземпляру XML результирующий XML сериализуется с использованием двойных кавычек вокруг значений атрибутов.

DECLARE @x xml
-- Use double quotation marks.
SET @x = '<root a="1" />'
SELECT @x
GO
DECLARE @x xml
-- Use single quotation marks.
SET @x = '<root a=''1'' />'
SELECT @x
GO

Оба запроса вернут <root a="1" />.

Префиксы пространства имен

Префиксы пространств имен не сохраняются. При выполнении запроса XQuery к столбцу типа xml для сериализации результирующего XML могут использоваться другие префиксы пространства имен.

DECLARE @x xml
SET @x = '<ns1:root xmlns:ns1="abc" xmlns:ns2="abc">
            <ns2:SomeElement/>
          </ns1:root>'
SELECT @x
SELECT @x.query('/*')
GO

Префикс пространства имен в результате может быть другим. Например:

<p1:root xmlns:p1="abc"><p1:SomeElement/></p1:root>

См. также

Основные понятия