Поделиться через


query() (тип данных xml)

Определяет запрос XQuery для экземпляра типа данных xml. Результат имеет тип данных xml. Метод возвращает экземпляр нетипизированного XML.

Синтаксис

query ('XQuery')

Аргументы

  • XQuery
    Это строка, выражение XQuery, выполняющее в экземпляре XML запросы к узлам — элементам и атрибутам.

Примеры

В этом подразделе приведены примеры использования метода query() типа данных xml.

А. Использование метода query() для переменной типа данных xml

В следующем примере объявляется переменная @myDoc типа данных xml, и этой переменной присваивается экземпляр XML. Далее методом query() для документа определяется запрос XQuery.

Запрос извлекает дочерний элемент <Features> элемента <ProductDescription>:

declare @myDoc xml
set @myDoc = '<Root>
<ProductDescription ProductID="1" ProductName="Road Bike">
<Features>
  <Warranty>1 year parts and labor</Warranty>
  <Maintenance>3 year parts and labor extended maintenance is available</Maintenance>
</Features>
</ProductDescription>
</Root>'
SELECT @myDoc.query('/Root/ProductDescription/Features')

Результат:

<Features>
  <Warranty>1 year parts and labor</Warranty>
  <Maintenance>3 year parts and labor extended maintenance is available</Maintenance>
</Features>      

Б. Использование метода query() для столбца типа данных XML

В следующем примере метод query() используется для задания запроса XQuery к столбцу CatalogDescription типа данных xml в базе данных База данных AdventureWorks2008R2:

SELECT CatalogDescription.query('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
<Product ProductModelID="{ /PD:ProductDescription[1]/@ProductModelID }" />
') as Result
FROM Production.ProductModel
where CatalogDescription.exist('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
declare namespace wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain";
     /PD:ProductDescription/PD:Features/wm:Warranty ') = 1

В приведенном запросе обратите внимание на следующие моменты.

  • Столбец CatalogDescription является типизированным столбцом xml. Это означает, что имеется связанная с ним коллекция схем. В прологе XQuery ключевое слово namespace используется для определения префикса, который в дальнейшем используется в теле запроса.

  • Метод query() строит XML, элемент <Product>, имеющий атрибут ProductModelID, и значение атрибута ProductModelID извлекается из базы данных. Дополнительные сведения о конструировании XML см. в разделе Построение XML (XQuery).

  • Метод exist() (тип данных XML) в предложении WHERE используется для нахождения только тех строк, которые в XML содержат элемент <Warranty>. Ключевое слово namespace, опять же, используется для определения двух префиксов пространства имен.

Частичный результат:

<Product ProductModelID="19"/> 
<Product ProductModelID="23"/> 
...

Заметим, что оба метода — и query(), и exist() — объявляют префикс PD. В этих случаях для первоначального определения префиксов и использования их в запросе можно использовать WITH XMLNAMESPACES.

WITH XMLNAMESPACES (
   'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS PD,
   'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain' AS wm)
SELECT CatalogDescription.query('
<Product ProductModelID="{ /PD:ProductDescription[1]/@ProductModelID }" />
') as Result
FROM Production.ProductModel
where CatalogDescription.exist('
     /PD:ProductDescription/PD:Features/wm:Warranty ') = 1