Тип данных xml

Тип данных xml позволяет хранить XML-документы и их фрагменты в базе данных SQL Server. Фрагмент XML — это экземпляр XML, в котором отсутствует единственный элемент верхнего уровня. Можно создавать столбцы и переменные типа xml, в которых можно хранить экземпляры XML. При этом размер хранимого представления экземпляра типа данных xml не должен превышать 2 Гб.

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

Тип данных xml и связанные с ним методы облегчают интеграцию XML в реляционную платформу SQL Server. Дополнительные сведения см. в разделе Методы типа данных XML.

ms189887.note(ru-ru,SQL.90).gifПримечание.
В данном разделе описывается нетипизированный XML. Дополнительные сведения о типизированном XML см. в разделе Типизированный и нетипизированный XML.

Создание переменных и столбцов типа xml

Тип данных xml — это встроенный в SQL Server тип данных, несколько напоминающий другие встроенные типы данных, такие как int и varchar. Как и другие встроенные типы данных, тип данных xml можно использовать как тип столбца при создании таблицы, как тип переменной, параметра, тип возвращаемого функцией значения, а также в инструкциях CAST и CONVERT. Это демонстрируется в следующих примерах.

Пример A

Создание столбца типа xml:

CREATE TABLE T1(Col1 int primary key, Col2 xml) 

Пример Б

Создание переменной типа xml:

DECLARE @x xml 

Создание типизированной переменной xml путем указания коллекции XML-схем:

declare @x xml (Sales.StoreSurveySchemaCollection)

Пример В

Передача параметра типа xml в хранимую процедуру:

CREATE PROCEDURE SampleProc(@XmlDoc xml) AS ... 

Чтобы выполнять запросы к экземплярам XML, хранимым в столбцах, параметрах и переменных, можно использовать XQuery. Чтобы обновлять экземпляры XML, также можно использовать язык XML DML. Поскольку стандарт XQuery на момент разработки не определял язык XQuery DML, в SQL Server были введены расширения языка XML DML к XQuery. Эти расширения позволяют выполнять операции вставки, обновления и удаления.

Назначение значений по умолчанию

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

Пример A

Указание XML по умолчанию как константы XML (к строке неявно применяется инструкция CAST, преобразующая ее в тип xml):

CREATE TABLE T (XmlColumn xml default N'<element1/><element2/>')

Пример Б

Указание XML по умолчанию как результата явного применения инструкции CAST для преобразования в xml:

CREATE TABLE T (XmlColumn xml 
                  default CAST(N'<element1/><element2/>' AS xml))

SQL Server поддерживает ограничения NULL и NOT NULL для столбцов типа xml. Например:

CREATE TABLE T (XmlColumn xml NOT NULL)

Указание ограничений

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

В этом примере ограничение на столбец Col2 указывает, что каждый хранимый в этом столбце экземпляр XML должен иметь элемент <ProductDescription>, содержащий атрибут ProductID. Это ограничение принудительно применяется с помощью пользовательской функции:

CREATE FUNCTION my_udf(@var xml) returns bit
AS BEGIN 
RETURN @var.exist('/ProductDescription/@ProductID')
END
GO

Обратите внимание, что метод exist() типа данных xml возвращает значение 1, если элемент <ProductDescription> в экземпляре содержит атрибут ProductID. В противном случае возвращается значение 0.

Теперь возможно создание таблицы с ограничениями на уровне столбцов, как показано ниже:

CREATE TABLE T (
    Col1 int primary key, 
    Col2 xml check(dbo.my_udf(Col2)=1))
GO

Эта операция вставки выполняется успешно:

INSERT INTO T values(1,'<ProductDescription ProductID="1" />')

Из-за ограничения следующая операция вставки не будет выполнена:

INSERT INTO T values(1,'<Product />')

Изменение таблиц

Инструкция ALTER TABLE поддерживает тип данных xml. Например, можно преобразовать столбец любого строкового типа в тип данных xml. Учтите, что в этом случае документы, содержащиеся в этом столбце, должны быть корректными. Также при изменении типа столбца со строкового на типизированный xml документы, содержащиеся в столбце, должны корректно проходить проверку по указанным XSD-схемам.

CREATE TABLE T (Col1 int primary key, Col2 nvarchar(max))
GO
INSERT INTO T 
VALUES (1, '<Root><Product ProductID="1"/></Root>')
GO
ALTER TABLE T 
ALTER COLUMN Col2 xml
GO

Можно изменить тип содержащихся в столбце xml данных с нетипизированного на типизированный XML. Например:

CREATE TABLE T (Col1 int primary key, Col2 xml)
GO
INSERT INTO T 
values (1, '<p1:ProductDescription ProductModelID="1" 
xmlns:p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">
            </p1:ProductDescription>')
GO 
-- Make it a typed xml column by specifying a schema collection.
ALTER TABLE T 
ALTER COLUMN Col2 xml (Production.ProductDescriptionSchemaCollection)
GO
ms189887.note(ru-ru,SQL.90).gifПримечание.
Сценарий будет работать с базой данных AdventureWorks, потому что коллекция XML-схем Production.ProductDescriptionSchemaCollection создана в виде части базы данных AdventureWorks.

В предыдущем примере все сохраненные в столбце экземпляры проверяются на корректность и типизацию в соответствии с XSD-схемами из указанной коллекции. Если столбец содержит хотя бы один экземпляр XML, не проходящий проверку на соответствие указанной схеме, выполнение инструкции ALTER TABLE завершится ошибкой, и преобразование нетипизированного XML-столбца в типизированный будет невозможно.

ms189887.note(ru-ru,SQL.90).gifПримечание.
Если таблица имеет большой размер, операция изменения столбца типа xml может требовать много ресурсов. Причиной этого является необходимость проверки каждого документа на корректность, а для типизированного XML — также и проверки соответствия схеме.

Дополнительные сведения о типизированном XML см. в разделе Типизированный и нетипизированный XML.

Создание представлений

Чтобы создавать представления, можно использовать столбец типа xml. В следующем примере создается представление, в котором вызов метода value() типа данных xml получает значения из столбца типа xml.

-- Create the table.
CREATE TABLE T (
    ProductID          int primary key, 
    CatalogDescription xml)
GO
-- Insert sample data.
INSERT INTO T values(1,'<ProductDescription ProductID="1" ProductName="SomeName" />')
GO
-- Create view (note the value() method used to retrieve ProductName 
-- attribute value from the XML).
CREATE VIEW MyView AS 
  SELECT ProductID,
         CatalogDescription.value('(/ProductDescription/@ProductName)[1]', 'varchar(40)') AS PName
  FROM T
GO 

Выполните следующий запрос к представлению:

SELECT * 
FROM   MyView

Результат:

ProductID   PName      
----------- ------------
1           SomeName 
ms189887.note(ru-ru,SQL.90).gifПримечание.
Тип данных xml нельзя использовать в распределенных секционированных представлениях.

Использование XML в вычисляемых столбцах

Экземпляры XML могут встречаться в исходных данных для вычисляемого столбца и могут быть типом значений вычисляемого столбца. Например, в следующей инструкции CREATE TABLE столбец типа xml (col2) вычисляется из столбца col1:

CREATE TABLE T(col1 varchar(max), col2 AS CAST(col1 AS xml) )  

Тип данных xml может присутствовать в исходных данных при создании вычисляемого столбца, что демонстрирует следующая инструкция CREATE TABLE:

CREATE TABLE T (col1 xml, col2 as cast(col1 as varchar(1000) )) 

Пример создания вычисляемого столбца, получающего значение из столбца типа xml, приводится ниже. Поскольку методы типа данных xml нельзя прямо использовать при создании вычисляемых столбцов, в примере сначала определяется функция (my_udf), возвращающая значение для экземпляра XML. Функция является интерфейсом к методу value() типа xml. Имя функции затем указывается в инструкции CREATE TABLE в части, соответствующей вычисляемому столбцу.

CREATE FUNCTION my_udf(@var xml) returns int
AS BEGIN 
RETURN @var.value('(/ProductDescription/@ProductModelID)[1]' , 'int')
END
GO
-- Use the function in CREATE TABLE.
CREATE TABLE T (col1 xml, col2 as dbo.my_udf(col1) )
GO
-- Try adding a row. 
INSERT INTO T values('<ProductDescription ProductModelID="1" />')
GO
-- Verify results.
SELECT col2, col1
FROM T
 

Как и в предыдущем примере, в этом примере определяется функция, возвращающая экземпляр типа xml для вычисляемого столбца. В функции вызывается метод query() типа данных xml, получающий значение из параметра типа xml.

CREATE FUNCTION my_udf(@var xml) 
  RETURNS xml AS 
BEGIN 
   RETURN @var.query('ProductDescription/Features')
END

В следующей инструкции CREATE TABLE столбец Col2 является вычисляемым столбцом, использующим XML-данные (элемент <Features>), возвращаемые функцией:

CREATE TABLE T (Col1 xml, Col2 as dbo.my_udf(Col1) )
-- Insert a row in table T.
INSERT INTO T VALUES('
<ProductDescription ProductModelID="1" >
  <Features>
    <Feature1>description</Feature1>
    <Feature2>description</Feature2>
  </Features>
</ProductDescription>')
-- Verify the results.
SELECT *
FROM T

См. также

Справочник

Использование предложений FOR XML и OPENXML для публикации и обработки XML-данных

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

Типизированный и нетипизированный XML
Формирование XML-экземпляров
Язык модификации XML-данных (XML DML)
Индексы для столбцов типа данных xml
Образцы приложений XML

Другие ресурсы

Методы типа данных XML

Справка и поддержка

Получение помощи по SQL Server 2005