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


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

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

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