Программирование >>  Программирование баз данных 

1 ... 187 188 189 [ 190 ] 191 192 193 ... 346


SELECT ProductModellD, Instructions.query(/PI:root/PI:Location/PI:step) AS Stpcx FROM Production.ProductModel WHERE ProductModellD = 66

Напоминаем, что все URL должны быть введены в виде одной строки.

Благодаря этому удобство запроса для чтения значительно повышается, притом что результирующий набор остается тем же.

Метод .value

Метод .value предназначен исключительно для получения отдельных фрагментов данных. В этом методе для поиска конкретного узла и извлечения скалярного значения используется синтаксис языка XPath. Оператор вызова этого метода имеет следующий синтаксис:

<instance of xml data type>.value (<XPath location>, <non-xml SQL Server Type>)

С использованием этого метода связана одна сложность - заданное в вызове метода выражение XPath действительно должно возвращать единственное значение, и в этом следует заранее убедиться.

Например, если бы потребовалось узнать значение атрибута LaborHours в первом элементе Location, относящемся к модели товара с идентификатором ProductModellD, равным 66, то можно было бы применить такой запрос:

WITH XMLNAMESPACES (http: schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions AS PI)

SELECT ProductModellD,

Instructions.value((/PI:root/PI:Location/@LaborHours)[1], decimal (5,2)) AS Location FROM Production.ProductModel WHERE ProductModellD =66

Напоминаем, что все URL должны быть введены в виде одной строки.

Рассмотрим полученные результаты: ProductModellD Location

66 1.50

(1 row(s) affected)

Заслуживает внимания то, что в СУБД SQL Server выполнена выборка только указанного значения атрибута (в данном случае атрибута LaborHours узла Location) в виде отдельного фрагмента данных. Возвращаемое значение должно иметь такой тип данных, который допускает приведение к типу данных SQL Server, отличному от XML, а само значение должно быть скалярным, т.е. не допускается возможность выборки данных нескольких строк.

Метод .modify

Метод .modify является немного более сложным по сравнению с другими методами типа данных XML.

Язык XQuery, который определен стандартом консорциума W3C, обеспечивает только чтение. Иначе говоря, этот язык является превосходным средством выборки данных, но не предоставляет никаких возможностей, эквивалентных возможностям



операторов INSERT, UPDATE или DELETE. Это означает, что язык XQuery является узко специализированным. Но в корпорации Microsoft за основу взят другой подход, предусматривающий применение универсальных средств, поэтому создано собственное расширение языка XQuery, позволяющее дополнить язык XQuery средствами манипулирования данными. Указанное расширение языка XQuery получило название XML DML (XML Data Manipulation Language- язык манипулирования данными XML). В языке XML DML предусмотрено добавление к языку XQuery трех новых операторов:

insert;

delete;

replace value of.

Эти новые команды, как и все ключевые слова XML, чувствительны к регистру.

Назначение каждой из этих команд соответствует ее имени, не считая того, что команда replace value of применяется в качестве оператора UPDATE языка SQL.

Если бы, допустим, потребовалось увеличить исходное значение рабочих часов, равное 1,5, в приведенном примере применения метода .value, то можно было бы составить такой оператор:

WITH XMLNAMESPACES (http: schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions AS PI)

UPDATE Production.ProductModel

SET Instructions.modify(replace value of (/PI:root/PI:Location/@LaborHours) [1] with 1.75) WHERE ProductModellD =66

Напоминаем, что все URL должны быть введены в виде одной строки.

Теперь, после повторного вызова метода .value будут получены следующие результаты:

WITH XMLNAMESPACES (http: schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions AS PI)

SELECT ProductModellD,

Instructions.value( (/PI:root/PI:Location/@LaborHours) [1] , decimal (5,2) ) AS Location

FROM Production.ProductModel WHERE ProductModellD = 66

Напоминаем, что все URL должны быть введены в виде одной строки.

Полученное новое значение становится таковым: ProductModellD Location

66 1.75

(1 row(s) affected)

Кстати, обратите внимание на то, что по существу в этом примере оператор обновления вложен в оператор обновления. Кроме того, осуществляется внесение изменений в строку, хранящуюся в базе данных SQL Server, поэтому необходимо воспользоваться оператором UPDATE, чтобы дать указание СУБД SQL Server на то, что



строка с реляционными данными (в которой теперь содержится код XML) должна быть обновлена. А для указания той части обновления, которая относится к коду XML, необходимо также применить ключевое слово repl асе value of.

Метод .nodes

Метод . nodes позволяет извлекать блоки узлов XML и выделять в них данные, которые после представления в реляционной форме преобразовались бы в несколько строк данных. Операцию, в которой берется отдельный документ XML и из него извлекаются отдельные части указанным образом, принято называть разборкой (shredding) документа.

Действия, выполняемые с помощью метода .nodes, по существу сводятся к тому, что происходит разбивка экземпляров данных XML и создание отдельной таблицы (количество строк в которой совпадает с количеством экземпляров, соответствующих критериям запроса на языке XQuery). Как и следовало ожидать, это означает, что результаты применения метода . nodes следует рассматривать скорее как таблицу, а не как столбец. Основное различие между выборкой данных с помощью метода .nodes и выборкой данных из обычной таблицы состоит в том, что должно быть обеспечено повторное применение результатов, полученных на основе метода .nodes, к той конкретной таблице, которая послужила источником данных XML. Таким образом, задача выборки данных с помощью метода .nodes не сводится к тому, чтобы вызвать на выполнение этот метод. В действительности требуется создать своего рода соединение, но с использованием специального ключевого слова cross apply вместо join и вызова . nodes вместо конструкции on. Применяемый при этом синтаксис выглядит так:

SELECT <column list> FROM <source table>

CROSS APPLY <column name>.nodes(<XQuery>) AS <table alias for your .nodes results>

Эта тема является довольно сложной, поэтому рассмотрим вначале приведенный ранее пример применения метода .value. Ниже показан запрос, в котором выполняет ся поиск определенной записи, поэтому происходит возврат точно одного результата:

WITH XMLNAMESPACES (http: schemas.microsoft.com/sqlserver/2004/07/adventure-works/ ProductModelManuInstructions AS PI)

SELECT ProductModellD,

Instructions.value((/PI:root/PI:Location/@LaborHours)[1], decimal (5,2)) AS Location FROM Production.ProductModel WHERE ProductModellD =66

Напоминаем, что все URL должны быть введены в виде одной строки.

Метод .value рассчитан на получение скалярного результата, поэтому необходимо обеспечить, чтобы применяемое выражение XQuery возвращало единственное значение в расчете на каждую отдельную строку, представленную в коде XML. А применение метода .nodes по существу является для ОЪД SQL Server указанием на то, что выражение XQuery должно использоваться для формирования указания на конкретное местонахождение в коде XML, после чего каждый отдельный фрагмент данных, найденный с помощью этого выражения XQuery, должен рассматриваться как относящийся к отдельной строке.



1 ... 187 188 189 [ 190 ] 191 192 193 ... 346

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика