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


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

Применимо к:SQL ServerБаза данных SQL AzureУправляемый экземпляр SQL AzureБаза данных SQL в Microsoft Fabric

Определяет запрос 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>        

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

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

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;

См. также

Добавление пространств имен в запросы с WITH XMLNAMESPACES
Сравнение типизированного и нетипизированного XML
Создание экземпляров данных XML
Методы для типа данных XML
Язык обработки XML-данных (XML DML)