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


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

Можно преобразовывать определения 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 года 1, приводят к ошибке среды выполнения при перестроении индекса, а операторы XQuery или XML-DML выполняются в отношении типа данных XML , содержащего это значение.

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

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

См. также