Сравнение типизированного и нетипизированного XML

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

XML-документы правильного формата и тип данных XML

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

XML-схемы

XML-схема предоставляет следующее.

  • Ограничения проверки. SQL Server проверяет типизированный экземпляр XML после каждой операции присвоения или изменения.

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

Выбор между типизированным и нетипизированным XML

В следующих ситуациях следует использовать нетипизированный тип данных xml.

  • Нет схемы XML-данных.

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

В следующих ситуациях следует использовать типизированный тип данных xml :

  • есть схемы XML-данных и требуется, чтобы сервер проверял соответствие данных этим схемам;

  • требуется оптимизировать хранение данных и обработку запросов на основе информации о типах;

  • требуется в более полной мере использовать информацию о типах при компиляции запросов.

В типизированных XML-столбцах, параметрах и переменных можно хранить XML-документы или содержимое. Во время объявления необходимо указать при помощи флага, что хранится: документ или содержимое. Кроме того, необходимо предоставить системе коллекцию XML-схем. Укажите флаг DOCUMENT, если каждый экземпляр XML имеет ровно один элемент верхнего уровня. В противном случае укажите флаг CONTENT. Компилятор запросов использует флаг DOCUMENT при проверке типов во время компиляции запросов для определения одинарных элементов верхнего уровня.

Создание типизированного XML

Перед созданием типизированных переменных, параметров или столбцов xml, сначала необходимо зарегистрировать коллекцию XML-схем с помощью раздела CREATE XML SCHEMA COLLECTION (Transact-SQL). Затем коллекцию XML-схем можно связать с переменными, параметрами или столбцами типа xml.

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

Пример. Связывание коллекции схем с переменными типа xml

В следующем примере создается переменная типа xml и связывается с коллекцией схем. Коллекция схем, указанная в этом примере, уже импортирована в базу данных База данных AdventureWorks2008R2.

DECLARE @x xml (Production.ProductDescriptionSchemaCollection) 

Пример. Указание схемы для столбца типа xml

В следующем примере создается таблица со столбцом типа xml и указывается схема для этого столбца.

CREATE TABLE T1(
 Col1 int, 
 Col2 xml (Production.ProductDescriptionSchemaCollection)) 

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

В следующем примере параметр типа xml передается хранимой процедуре и указывается схема для переменной.

CREATE PROCEDURE SampleProc 
  @ProdDescription xml (Production.ProductDescriptionSchemaCollection) 
AS 

Обратите внимание на следующие сведения о коллекции XML-схем.

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

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

  • Данные можно приводить из типизированного xml в нетипизированный xml и наоборот.

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

В иерархии типов данных данные xml отображаются ниже sql_variant и определяемых пользователем типов, но выше всех встроенных типов.

Пример. Указание аспектов для ограничения типизированного XML-столбца

На типизированные xml-столбцы можно наложить ограничение, допускающее в них только отдельные элементы высшего уровня для каждого сохраненного в них экземпляра. , для указания дополнительного аспекта DOCUMENT при создании таблицы, как показано в следующем примере:

CREATE TABLE T(Col1 xml 
   (DOCUMENT Production.ProductDescriptionSchemaCollection))
GO
DROP TABLE T
GO

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

  • ноль или несколько элементов верхнего уровня;

  • текстовые узлы в элементах верхнего уровня.

Также можно явно указать данное поведение, добавив аспект CONTENT, как показано в следующем примере.

CREATE TABLE T(Col1 xml(CONTENT Production.ProductDescriptionSchemaCollection))
GO -- Default

Обратите внимание, что дополнительные аспекты DOCUMENT/CONTENT можно указать везде, где определен тип xml (типизированный XML). Например, при создании типизированной xml-переменной аспект DOCUMENT/CONTENT можно добавить следующим образом:

declare @x xml (DOCUMENT Production.ProductDescriptionSchemaCollection)

Определение типа документа (DTD)

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

Можно преобразовывать определения DTD в документы XML-схем при помощи инструментов других компаний и загружать эти XML-схемы в базу данных.

Обновление типизированного XML с SQL Server 2005 до SQL Server 2008

В SQL Server 2008 имеется несколько расширений для поддержки XML-схем, включая поддержку нестрогой проверки, улучшенную обработку данных экземпляров xs:date, xs:time и xs:dateTime, а также добавлена поддержка для типов списков и объединений. В большинстве случаев эти изменения не влияют на вопросы обновления. Однако, если в SQL Server 2005 используется коллекция XML-схем, допускающая значения типов xs:date, xs:time или xs:dateTime (или любых их подтипов), то во время присоединения базы данных SQL Server 2005 к SQL Server 2008 потребуется выполнить следующие шаги обновления:

  1. Со всеми XML-столбцами, введенными с коллекцией XML-схемы, в которой содержатся элементы или атрибуты, принадлежащие типам xs:anyType, xs:anySimpleType, xs:date или любым их подтипам, xs:time или любым его подтипам, xs:dateTime или любым его подтипам либо являющиеся объединениями или списками с элементами любых из перечисленных типов, происходит следующее:

    1. отключаются все XML-индексы столбца;

    2. все значения SQL Server 2005 продолжают отображаться в часовом поясе Z, поскольку они были нормализованы по часовому поясу Z;

    3. все значения xs:date или xs:dateTime, предшествующие дате «1 января 1 года», приведут к ошибке выполнения при перестроении индекса или применении инструкции XQuery или XML-DML к XML-данным, содержащим такие значения;

  2. все отрицательные значения года в аспектах xs:date или xs:dateTime или значения по умолчанию в коллекции XML-схем автоматически обновляются до наименьшего значения, допустимого базовыми типами xs:date или xs:dateTime (например, 0001-01-01T00:00:00.0000000Z для xs:dateTime).

Обратите внимание, что при помощи простой SQL-инструкции SELECT можно получить весь тип XML-данных, даже если в нем содержатся отрицательные значения года. Отрицательные значения года рекомендуется заменить значением года в обновленном поддерживаемом диапазоне; кроме того, можно изменить тип элемента или атрибута на xs:string.