- •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-выражения
- •Кванторные выражения
- •Сортировка
- •Заключение
- •Литература
Кванторные выражения
Кванторные выражения делятся на два типа: квантор существования, при котором определяется истинность условия для любого элемента последовательности, и квантор общности, при котором определяется истинность условия для каждого элемента последовательности.
Синтаксис выражения следующий:
( "some" | "every" ) Variable "in" Expression "satisfies" Expression |
Где:
Variable – имя переменной.
Expression – выражение XQuery, возвращающее последовательность.
Кванторное выражение служит примерно тем же целям, что и ключевые слова SOME и ANY в SQL. Например, следующий запрос возвращает все элементы а, которые больше всех элементов b:
declare @xml xml set @xml = '<a>10</a>, <a>5</a>, <b>4</b>, <a>3</a>, <b>6</b>' select @xml::query(' for $a in /a where every $b in /b satisfies xs:integer($b) < xs:integer($a) return $a ') |
Результат:
<a>10</a> |
Для большей наглядности перепишем предыдущий пример на SQL:
--создание таблицы create table test(a int, b int)
--наполнение ее данными insert into test values(1, 2) insert into test values(1, 3) insert into test values(4, 1)
--запрос, возвращающий все значения поля а, которое больше --любого значения поля b select a from test4 where a > any (select b from test4) |
Сортировка
С сортировкой всегда была проблема. Редакторы спецификации все никак не могли решить – является ли она частью FLWR-выражения или нет. Если нет, то это должна быть универсальная конструкция, позволяющая сортировать любую последовательность. Подобное описание сортировки с использованием ключевого слова sortby можно найти в [10]. В SQL Server-е реализован именно такой метод, правда, с серьезным ограничением (или багом).
declare @xml xml set @xml = '<a>1</a><a>2</a>' select @xml::query('/a sortby (. descending)') |
Здесь оператор sortby применяется к последовательности узлов а и сортирует их по их содержимому в порядке убывания. Этот оператор может сортировать любую последовательность, однако в следующем примере SQL Server видит какой-то подвох, и исполнять его отказывается, выдавая сообщение об ошибке: XQuery: Operand of 'sortby' has invalid type.
declare @xml xml set @xml = '<a>1</a><a>2</a>' select @xml::query('(1, 2, 3) sortby (. descending)') |
Видимо, для простых последовательностей разработчики реализовать сортировку не успели.
Надо сказать, что в текущей версии рабочего черновика стандарта оператор sortby отсутствует. Его заменил оператор order by в конструкции FLWOR. Функциональность от этого совершенно не пострадала. Например, предыдущие запросы переписываются так:
(: сортировка элементов а по их содержимому в обратном порядке :) for $a in /a order by $a descending return $a
(: сортировка последовательности :) for $a in (1, 2, 3) order by $a descending return $a |
Синтаксис стал чуть более сложным, но на мой взгляд, такой запрос значительно понятнее.
Выполнять сортировку можно по нескольким критериям (ordering specifications). Например:
for $a in (<a b="2">1</a>, <a b="1">1</a>, <a b="1">2</a>) order by $a, $a/@b return $a |
Здесь сначала выполняется сортировка по значению узла элемента а, а затем – по значению узла атрибута b.
Результат:
<?xml version="1.0" encoding="utf-16"?><a b="1">1</a> <a b="2">1</a> <a b="1">2</a> |
При сортировке строковых элементов последовательности можно указывать collation, которое будет использоваться при сравнении соответствующих значений. К другим параметрам сортировки относятся:
stable order by – устойчивая сортировка. Этот тип сортировки сохраняет оригинальный порядок элементов последовательности в случае, когда они равны (более точный термин – эквивалентны). Устойчивая сортировка выполняется чуть дольше.
empty (greatest | least) – указывает, где будут появляться элементы, ключ сортировки которых содержит пустую последовательность (в начале или конце).
Ни один из этих параметров сортировки не поддерживается в SQL Server.
