Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Определяет запрос 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 в базе данных 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 DML)