Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Использование XML совместно с SQL.doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
1 Мб
Скачать
☆

Тип данных xml Основы

XML-документ или фрагмент представлен в виде нового типа данных – xml. Вы можете создавать атрибуты таблиц или переменные данного типа. Инициализировать их можно просто строкой, например:

declare @xml xml

set @xml = N'<root/>'

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

declare @xml xml

--здесь переменная @xml равна NULL,

--поэтому следующий запрос возвращает NULL

select @xml::query('/*')

--создаем экземпляр

set @xml = ''

--здесь возвращается пустая строка

select @xml::query('/*')

XML-тип похож на строковый: единственное ограничение заключается в том, что строка должна представлять сбалансированный XML-фрагмент. Под сбалансированным XML-фрагментом (это не официальный термин, однако он встречается в литературе) понимается XML-фрагмент, который полностью удовлетворяет спецификации XML 1.0 за исключением того, что не имеет корневого элемента. Такой документ нельзя назвать правильно оформленным (well formed), однако в некоторых языках (XPath, XQuery) он допустим.

Переменная строкового типа неявно преобразуется к XML-типу. Обратное не верно: для того, чтобы получить экземпляр XML-типа вам необходимо выполнить явное преобразование с помощью операторов cast или convert.

ПРИМЕЧАНИЕ

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

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

--создаем два поля: x – типа xml, str – типа varchar

create table T(x xml default('<root/>'), str varchar(100) default('<root/>'))

--изменяем тип поля str, на xml.

alter table T alter column str xml

В принципе, такое поведение вполне логично. Xml – это прежде всего текст! Давайте рассмотрим, чем же он отличается от обычной строки.

С XML-типом можно связать схему (xml schema), которая предназначена для проверки структуры документа. Документ, соответствующий определенной схеме, называется допустимым (well formed). Схемы данных описываются с помощью специального языка XML Schema definition language (XSD), который в свою очередь также выражается с помощью xml. Спецификация XML Schema принята уже относительно давно, более детальную информацию о ней и официальные документы можно найти в [5].

Создадим простенькую схему для документа, который может содержать только один XML-элемент с названием root, не может содержать атрибутов и дочерних элементов. Значение элемента root ограничено строковым типом. Забегая вперед скажу, что в SQL Server-е название схемы явно не задается, оно получается из целевого имени (targetNamespace) пространства имен схемы данных.

Создается схема с помощью новой инструкции create xmlschema. Вот как это делается:

create xmlschema

'<?xml version="1.0" encoding="windows-1251" ?>

<xs:schema

xmlns:xs="http://www.w3.org/2001/XMLSchema"

targetNamespace="my-first-schema"

>

<xs:element name="root" type="xs:string"/>

</xs:schema>'

О работе со схемами в SQL Server я поговорю чуть попозже, а теперь давайте попытаемся создать экземпляр документа этой схемы:

declare @xml xml ('my-first-schema')

set @xml = '<root xmlns="my-first-schema" a=""/>'

Так как наличие каких-либо атрибутов запрещено схемой, в момент присваивания строкового литерала переменной @xml, мы получаем ошибку:

XML Validation: Undefined or prohibited attribute specified: 'a'

Переменная XML-типа, которая связана с какой-либо схемой данных, называется типизированной. Вы можете изменять тип (т.е. схему) полей XML-типа с помощью команды alter table, как, например, в следующем примере (таблица T была создана в примере выше):

alter table T alter column x xml('my-first-schema')

Теперь атрибут x таблицы T является типизированным. При попытке вставить в него фрагмент, не соответствующий схеме, будет сгенерированна ошибка. Например команда,

insert into T default values

попытается вставить в него документ <root/> (заданный по умолчанию), который не принадлежит пространству имен my-first-schema, поэтому сервер выдаст ошибку:

XML Validation: Specified element 'root' is not valid at this location

Так как xml – это полноценный тип, у него есть методы:

  • query – позволяет выполнять запросы XQuery.

  • value – выбирает скалярное значение с помощью запроса XQuery.

  • exist – возвращает булево значение, если результат запроса XQuery вернул не пустую последовательность.

  • modify – позволяет изменять содержимое XML-документа.