Тип данных xml
Тип данных xml позволяет хранить XML-документы и их фрагменты в базе данных SQL Server. Фрагмент XML — это экземпляр XML, в котором отсутствует единственный элемент верхнего уровня. Можно создавать столбцы и переменные типа xml, в которых можно хранить экземпляры XML. При этом размер хранимого представления экземпляра типа данных xml не должен превышать 2 Гб.
По желанию коллекцию XML-схем можно ассоциировать со столбцом, параметром или переменной, имеющими тип xml. Схемы в коллекции используются для проверки и типизирования экземпляров XML. В этом случае XML называется типизированным.
Тип данных xml и связанные с ним методы облегчают интеграцию XML в реляционную платформу SQL Server. Дополнительные сведения см. в разделе Методы типа данных XML.
Примечание. |
---|
В данном разделе описывается нетипизированный 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
Примечание. |
---|
Сценарий будет работать с базой данных AdventureWorks, потому что коллекция XML-схем Production.ProductDescriptionSchemaCollection создана в виде части базы данных AdventureWorks. |
В предыдущем примере все сохраненные в столбце экземпляры проверяются на корректность и типизацию в соответствии с XSD-схемами из указанной коллекции. Если столбец содержит хотя бы один экземпляр XML, не проходящий проверку на соответствие указанной схеме, выполнение инструкции ALTER TABLE
завершится ошибкой, и преобразование нетипизированного XML-столбца в типизированный будет невозможно.
Примечание. |
---|
Если таблица имеет большой размер, операция изменения столбца типа 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
Примечание. |
---|
Тип данных 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