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


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

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

Можно создать переменные, параметры и столбцы типа 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, с которой затем связывается коллекция схем. Коллекция схем, указанная в примере, уже импортирована в базу данных AdventureWorks .

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. Однако встроенный DTD можно использовать и с нетипизированными, и с типизированными XML, чтобы задавать значения по умолчанию и заменять ссылки на сущности их расширенными формами.

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

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

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

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

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

    2. Все значения SQL Server 2005 (9.x) будут по-прежнему представлены в часовом поясе 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).

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

См. также