- •Iis и xml функции sql Server
- •Поддержка xml в Microsoft sql Server 2000
- •Примеры
- •Iis и xml функции sql Server
- •Шаблоны
- •Запросы xPath
- •Замечания по разделу
- •Возможности ado 2.5 Сохранение и загрузка из файла в формате xml
- •Выдача Recordset’а в формате xml непосредственно в поток Response
- •Трансформация с помощью domDocument
- •Возможности ado 2.6
- •Использование Command для формирования xml-документа на сервере
- •Выполнение шаблона
- •Выполнение запроса xPath
- •Шаблон с агрегатными функциями
- •Формирование xml-документа на клиенте с помощью ado
- •Апдейтаграммы и xml Bulk Load
- •Апдейтаграммы
- •Добавление данных
- •Обновление данных
- •Удаление
- •Создание новой таблицы и загрузка данных
- •Загрузка иерархических документов
- •Заключение
- •Литература
- •Предисловие
- •Настройка iis
- •Содержание wsdl-файла
- •Секция types
- •Секция message
- •Секция portType
- •Формы сообщений
- •Секция binding
- •Секция service
- •Создание Web-методов
- •Тестируем Web-сервис
- •Поддержка sqlxml в .Net Framework
- •Тестовый проект
- •Цели и ограничения
- •Реализация
- •Заключение
- •Литература
- •Тип данных xml Основы
- •Метод query
- •Метод value
- •Метод exist
- •Метод modify
- •Использование xml-типа
- •Хранение xml-типа
- •Поддержка xml Schema
- •Создание схемы
- •Удаление схемы
- •Ограничения текущей реализации
- •Безопасность
- •Вложенные запросы for xml
- •Генерация xsd на лету
- •Поддержка xQuery
- •Тело запроса
- •Конструкторы узлов
- •Операторы сравнения
- •Операторы сравнения атомарных значений
- •Общие операторы сравнения
- •Операторы сравнения узлов
- •Логические операторы
- •Условные выражения
- •Flwor-выражения
- •Кванторные выражения
- •Сортировка
- •Заключение
- •Литература
Тип данных 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-документа.
