Поделиться через


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

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

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

Чтобы создать в таблице столбец типа xml, воспользуйтесь инструкцией CREATE TABLE , приведенной в следующем примере:

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

Функция DECLARE statement , приведенная в следующем примере, позволяет создать переменную типа xml.

DECLARE @x xml 

Создайте типизированную переменную xml, указав коллекцию XML-схем, как показано в следующем примере.

DECLARE @x xml (Sales.StoreSurveySchemaCollection)

Чтобы передать параметр типа xml хранимой процедуре, воспользуйтесь инструкцией CREATE PROCEDURE , как показано в следующем примере.

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

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

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

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

Чтобы указать в качестве экземпляра XML по умолчанию константу XML, воспользуйтесь синтаксической конструкцией из следующего примера. Обратите внимание, что строка неявно приведена к типу 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-схемах. Допустим, что адреса доставки заказов магазином цветов должны находиться не далее 90 километров от магазина. Это требование можно выразить в форме ограничения XML-столбца. Эти ограничения могут содержать методы для обработки данных типа xml.

  • В ограничении фигурируют другие столбцы таблицы, имеющие тип XML или другой тип. В качестве примера можно привести требование, согласно которому идентификатор заказчика (/Customer/@CustId), хранимый в экземпляре XML, должен соответствовать значению из реляционного столбца CustomerID.

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

  • PRIMARY KEY и FOREIGN KEY

  • UNIQUE

  • COLLATE

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

  • RULE

Помимо использования ограничений, можно создать оболочку, то есть определяемую пользователем функцию, являющуюся интерфейсом к методу типа данных 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 />')

Та же таблица или другая

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

Столбец типа xml следует создавать в той же таблице, если выполняется одно из перечисленных ниже условий.

  • Приложение извлекает данные из XML-столбца и не нуждается в том, чтобы для него был создан XML-индекс.

  • Для столбца типа xml требуется создание XML-индекса, причем первичный ключ главной таблицы идентичен ее ключу кластеризации. Дополнительные сведения см. в разделе Индексы для столбцов типа данных xml.

Столбец типа xml следует создавать в отдельной таблице, если выполняются перечисленные ниже условия.

  • Для столбца типа xml требуется создание XML-индекса, но первичный ключ главной таблицы отличается от ее ключа кластеризации, главная таблица не имеет первичного ключа или главная таблица является кучей (нет ключа кластеризации). Это может иметь место, если главная таблица уже существует.

  • Не требуется замедлять просмотр таблицы из-за наличия в ней XML-столбца. Он занимает место независимо от того, хранится ли он в строке или вне строки.

См. также

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