В SQL есть возможности для работы с XML. Полноценная работа с XML должна включать следующее:
Представление результатов запроса в виде XML-страниц.
Запросы к XML-страницам.
Запросы к БД из XML-страниц.
Рассмотрим первые две возможности на примере Microsoft SQL Server 2000. Результирующую выборку можно представлять в формате XML с помощью ключевых слов FOR XML оператора SELECT, а также сделать запрос из документа XML с помощью оператора OPENXML.
Оператор FOR XML предназначен для представления результирующего набора строк в виде XML-документа. Он пишется в конце запроса с различными вспомогательными ключевыми словами, с помощью которых описывается, в какой форме данные будут представлены. Ключевые слова описаны в Табл. 62.
Табл. 62. Ключевые слова в FOR XML
Слово
Смысл
Пример
FOR XML RAW
Результат – страница из тегов <row>. Поля запроса представлены в виде атрибутов этих тегов.
Лист. 87, Лист. 88
FOR XML AUTO
Результат – страница из тегов <Имя_таблицы>. Поля запроса представлены в виде атрибутов этих тегов.
Лист. 89, Лист. 90
FOR XML AUTO, ELEMENTS
Результат – страница из тегов <Имя_таблицы>. Поля запроса представлены в виде тегов <имя_поля>
Лист. 91, Лист. 92
FOR XML EXPLICIT
Можно формировать практически любые документы; структура результирующего XML-документа определяется непосредственно в самом запросе. Запрос может принимать очень сложный вид.
В данной книге не рассматривается
Лист. 87 Запрос с FOR XML RAW
select au_fname, au_lname, address
from authors
where au_fname like 'M%'
for xml raw
Лист. 88. Результат запроса с FOR XML RAW
<row au_fname="Marjorie" au_lname="Green" address="309 63rd St. #411" />
<row au_fname="Michael" au_lname="O'Leary" address="22 Cleveland Av. #14" />
...
Лист. 89 Запрос с FOR XML AUTO
select au_fname, au_lname, address
from authors
where au_fname like 'M%'
for xml auto
Лист. 90. Результат запроса с FOR XML AUTO
<authors au_fname="Marjorie" au_lname="Green" address="309 63rd St. #411" />
<authors au_fname="Michael" au_lname="O'Leary" address="22 Cleveland Av. #14" />
...
Лист. 91 Запрос с FOR XML AUTO, ELEMENTS
select au_fname, au_lname, address
from authors
where au_fname like 'M%'
for xml auto, elements
Лист. 92 Результат запроса с FOR XML AUTO, ELEMENTS
<authors>
<au_fname>Marjorie</au_fname>
<au_lname>Green</au_lname>
<address>309 63rd St. #411</address>
</authors>
<authors>
<au_fname>Michael</au_fname>
<au_lname>O'Leary</au_lname>
<address>22 Cleveland Av. #14</address>
</authors>
...
Функция OPENXML является аналогом OPENROWSET, OPENDATASOURCE и OPENQUERY, которые позволяют выполнять запросы из удаленных источников. Использование оператора select должно сопровождаться операторами exec sp_xml_preparedocument и exec sp_xml_removedocument, которые подготавливают и закрывают документ соответственно. Функция OPENXML используется в операторе FOR, где вместо таблицы приводится XML-документ с конструкцией Xpath, описывающей фрагмент этого документа (в квадратных скобках указывается условие отбора элементов). После функции OPENXML идет конструкция WITH, которая описывает, как элементы XML-документа преобразуются в поля таблицы. Пример XML-документа приведен на Лист. 93, запрос – на Лист. 94, результаты запроса – в Табл. 63.
В XPath-выражениях можно использовать и сокращенную запись: «attribute::» можно заменить символом @; «self::node()» - на точку (.); «parent::node()» - на две точки (..). Другие сокращения можно найти в спецификации XPath.
Рассмотрим более сложный пример: выберем название форума, модератора и дату создания статистики для всех форумов, у которых больше 6000 сообщений (запрос см. на Лист. 95, часть запроса, использующую XPath, в сокращенной форме - Лист. 96).
Лист. 95 SQL запрос с использованием XPath и конструкции with
exec sp_xml_preparedocument @hdoc out, @_xmlbody
select
forum as 'Форум',
case when moders is null
then 'нет'
else moders
end as 'Модератор',
[date] as 'Дата создания'
from openxml(@hdoc,'/rsdn/forums/forum[attribute::totalposts > "6000"]') with
Лист. 96. SQL-запрос с использованием сокращенной записи XPath
openxml(@hdoc,'/rsdn/forums/forum[@totalposts > "6000"]') with
(
moders varchar(50) 'moderators/moderator/@name',
forum varchar(50) '@name',
[date] varchar(50) '../@date'
)
Подробнее о XML и SQL см. [9].
Д/З 14. Для примера БД из Д/З 4 напишите запрос с представлением результатов в XML (вариант представления с полями в качестве элементов). Для примера XML-документа из Д/З 13 напишите запрос на языке SQL.
Вопросы для самопроверки:
1. Можно ли в XML создавать пользовательские теги?