- •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-выражения
- •Кванторные выражения
- •Сортировка
- •Заключение
- •Литература
Метод query
Метод query используется, когда необходимо выполнить запрос XQuery к XML-документу или фрагменту. Метод возвращает экземпляр типа xml, содержащий результат выполнения запроса. Поддержка развивающегося стандарта запросов для XML-документов соответствует черновикам стандарта, выпущенным консорциумом w3c на протяжении 2002 года [2]. Синтаксис вызова метода следующий:
query ('XQuery'[, noderef]) |
Где:
XQuery – запрос XQuery к данному экземпляру XML-документа.
noderef – ссылка на узел, относительно которого выполняется запрос.
Ссылку на узел можно получить с помощью табличной функции xmlnoderefs, возвращающей таблицу с одним полем noderef, записи которой содержат ссылки на выбранные узлы документа. Синтаксис функции следующий:
xmlnoderefs (xmlTypeInstance, 'XQuery', [ noderef ]) |
Где:
xmlTypeInstance – экземпляр XML-типа.
XQuery – запрос XQuery.
noderef – ссылка на узел, относительно которого выполняется запрос.
Ссылка на узел – это просто некоторый внутренний числовой идентификатор, обозначающий узел и действительный только в пределах данного запроса. Например, значения, возвращаемые следующим запросом, вы можете только наблюдать, нигде использовать их не получится:
declare @xml xml set @xml = ' <fam> <husband income="180">alex</husband> <wife income="161">rosa</wife> <son income="90">dima</son> </fam>' select * from xmlnoderefs(@xml, '/fam/*') |
Результат (ссылки на три дочерних узла элемента fam):
noderef -------- 0x5AC0 0x5B40 0x5BC0 |
Использование этой функции может привести к существенному увеличению производительности в тех случаях, когда в запросах используются «почти повторяющиеся» пути. Другое применение заключается в возможности работать с набором узлов в запросе, а не с одним документом или фрагментом xml. Выберем, например, суммарный доход всех членов семьи:
declare @xml xml set @xml = ' <fam> <husband income="180">alex</husband> <wife income="161">rosa</wife> <son income="90">dima</son> </fam>' select @xml::value('@income', 'int', noderef) from xmlnoderefs(@xml, '/fam/*') |
Это единственный способ выполнить подобный запрос, так как запрос "в лоб"
select @xml::query('/fam/*/@income') |
не работает, потому что метод query возвращает XML-документ или фрагмент, но никак не атрибуты (сервер выдает ошибку – XQuery: Attribute may not appear outside of an element). Использование метода value:
select @xml::value('/fam/*/@income', 'int') |
также не возможно, поскольку он должен возвращать скалярное значение (сервер выдает ошибку – XQuery: Expression used by 'value()' must return a singleton or empty sequence).
Также можно использовать табличную функцию xmlnoderefs вместе с новым оператором APPLY, который позволяет вызывать произвольную табличную функцию для каждой строки внешней таблицы [3]. Допустим, таблица fams содержит семьи.
create table fams( id int identity primary key, fam xml ) |
Необходимо выбрать доход каждого из членов семей:
select fam::value('@income', 'int', noderef) from fams cross apply xmlnoderefs(fam, '/fam/*') |
Здесь функция xmlnoderefs вызывается для каждой семьи (для каждой строчки таблицы) и возвращает три ссылки на дочерние элементы (fam). Для каждой ссылки, которая обозначает узел XML-элемента (husband, wife или son) вызывается метод value.
ПРИМЕЧАНИЕ По неофициальной информации, функция xmlnoderefs уже устранена во второй бете SQL Server 2005. Ей на смену пришел пятый метод XML-типа – nodes, который, по-видимому, будет возвращать как раз набор узлов, а не малопригодные ссылки на узлы. Проверить это пока не представляется возможным. |
