Главная » Microsoft SQL Server, Базы данных » Выполнение запросов к данным XML

0

Когда данные хранятся непосредственно в столбцах с типом XML, для извлечения этих данных, их вставки и обновления можно использовать XPath и XQuery. Язык XQuery является относительно молодым, и работа над ним продолжается в настоящее время.

Если вы когда-либо использовали XPath, считайте, что прошли половину пути в освоении XQuery. Практически все допустимые инструкции XPath являются также и инструкциями XQuery. К тому же XPath используется для отбора значений в выражениях XQuery FLWOR.

Для полного описания языка XQuery и методов слияния реляционных запросов с запросами XQuery могла бы понадобиться толстая книга объемом в тысячу страниц. Однако можно определенно заявить следующее: по мере эволюции технологий работы с данными, XML и XQuery станут неотъемлемой частью любой связанной с данными деятельности.

Xpath

XPath является функцией XML. Она привносит в XML ограничения результатов и средства обобщения при навигации по иерархии XML для доступа к любому узлу (элементу, атрибуту или фрагменту текста) в документе XML. Программный код XPath может быть добавлен для фильтрации данных в стилевую таблицу XSL или в другие запросы XML. Выгоднее всего использовать XPath в шаблонах SQL Server.

Вначале XPath должен идентифицировать узел. Идентификация узла функционально сходна с именем столбца в предложении WHERE инструкции SELECT. Например, для перехода к элементу event, содержащемуся в элементе tour, используется следующая структура: /Tours/Tour/Event

В приведенном примере использована абсолютная адресация. Местонахождение узла может быть указано и относительно текущего положения, чтобы фрагмент XSL, работающий с дочерними данными, мог выбрать узел родителя для процесса фильтрации.

Чтобы спуститься по дереву иерархии XML до атрибута, используется символ @, как в следующем примере:

/Tours/Tour/@Name

После того как идентифицирован корректный узел, XPath позволяет использовать несколько средств фильтрации для отбора корректных данных. Для применения фильтра WHERE = критерий определяется сразу после названия узла и заключается в квадратные скобки:

/Tours/Tour/@Name [‘Gauley River Rafting’]

В следующем примере используется функция запроса для извлечения данных XPath в реляционном запросе:

SELECT Customer, OrderDetail.query(

‘/Items[1]/Item[1] /SKU’)

FROM XMLOrders

Запросы FLWOR

Запросы FLWOR являются сердцем языка XQuery. Аббревиатура FLWOR составлена из первых букв последовательности предложений For-Let-Where-Order By-Return. В самом названии заложен синтаксис данных запросов. Это аналогично последовательности операций в обычном реляционном запросе SELECT, однако запросы FLWOR последовательно проходят по иерархическим данным XML.

Назначение предложения For соответствует одноименному предложению в языке SQL. Так как язык XQuery проектировался разработчиками приложений, а не баз данных, под конструкцией For на самом деле подразумевается конструкция For Each, которая предполагает последовательное прохождение по всем элементам. Это раскрывает не пакетный характер мышления в XML.

Предложение Let используется для присвоения значения переменным, которые в дальнейшем будут участвовать в запросе XQuery. В SQL Server 2005 ключевое слово Let не поддерживается.

Назначение предложения Where идентично его назначению в SQL— оно ограничивает элементы и атрибуты XML, отбираемые запросом.

Предложение Order By также будет интуитивно понятно программистам SQL. Предложение Return специфично для языка XQuery. Этот креативный синтаксис используется для конфигурирования формата данных XML, возвращаемых запросом XQuery.

SELECT Customer, OrderDetail.query(

‘for $i in /Items/Item where $i/Quantity = 2 return $i/SKU1)

FROM XMLOrders

Как будет показано в следующем разделе, запросы XQuery используют в функциях реляционных запросов.

Слияние XQuery с инструкцией select

Запросы XQuery в SQL Server слегка отличаются от стандарта. Причиной этому стало то, что стандарт XQuery создавался для извлечения данных из файлов XML, в то время как методы XQuery в SQL Server предназначены для интеграции в инструкции SELECT.

Метод exist проверяет наличие заданного узла, аналогично синтаксису IF EXISTS языка SQL:

SELECT Customer FROM XMLOrders WHERE OrderDetail.exist(

1/Items/Item[SKU = 234]’)=1

Метод exist возвращает значение 1, если узел существует, или 0 — в противном случае: Name

Sam

Метод value возвращает фактическое значение узла; он может вернуть только скалярное значение:

SELECT Customer,OrderDetai1.value(

‘/Items[1]/Item[1]/SKU[1]’, ‘VARCHAR(25)’)

FROM XMLOrders

Метод query позволяет запросу XQuery вернуть в реляционный запрос SELECT данные в полном объеме:

SELECT Customer, OrderDetail.query(

‘for $i in /Items/Item return $i/SKU’)

FROM XMLOrders

Метод nodes является, пожалуй, самым полезным при работе с XQuery. Он возвращает набор строк, который может быть объединен с реляционными данными в запросе SELECT.

Последний метод, modify, используется для изменения значений в переменных или столбцах с типом XML. Этот метод предназначен для использования в инструкции UPDATE и может изменять данные с помощью команд insert, delete и replace:

UPDATE XMLOrders

SET OrderDetail.modify(

‘insert

dtems SKU = n678" Quantity = "2n/> into /Items[1] *

)

WHERE OrderlD = 1

UPDATE XMLOrders

SET OrderDetail.modify(

‘delete /Items/Item[1]1 )

WHERE OrderlD = 1

Источник: Нильсен, Пол. Microsoft SQL Server 2005. Библия пользователя. : Пер. с англ. — М. : ООО “И.Д. Вильямс”, 2008. — 1232 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии