Méthode query() (type de données xml)

Indique une requête XQuery s'appliquant à une instance du type de données XML. Le résultat est de type xml. La méthode renvoie une instance XML non typé.

Syntaxe

query ('XQuery')

Argument

  • XQuery
    Expression XQuery de type chaîne, qui interroge les nœuds XML, tels que des éléments ou des attributs, dans une instance XML.

Exemples

Cette section propose des exemples d'utilisation de la méthode query() de type de données xml.

A. Utilisation de la méthode query() sur une variable de type xml

L'exemple suivant déclare une variable @myDoc de type xml et lui affecte une instance XML. La méthode query() est ensuite utilisée pour spécifier une requête XQuery portant sur le document.

La requête récupère l'élément enfant <Features> provenant de l'élément <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')

Voici le résultat obtenu :

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

B. Utilisation de la méthode query() sur une colonne de type XML

Dans l'exemple suivant, la méthode query() est utilisée pour indiquer une requête XQuery portant sur la colonne CatalogDescription de type xml tirée de la base données 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

Notez les points suivants dans la requête précédente :

  • La colonne CatalogDescription est une colonne xml typé. En d'autres termes, elle possède une collection de schémas qui lui est associée. Dans le prologue de la requête XQuery, le mot clé namespace est utilisé pour définir le préfixe utilisé plus loin dans le corps de la requête.

  • La méthode query() construit un élément de <Product> XML possédant un attribut ProductModelID dans lequel la valeur de l'attribut ProductModelID est récupérée de la base de données. Pour plus d'informations sur la construction XML, consultez Construction XML (XQuery).

  • La méthode exist() (type de données XML) indiquée dans la clause WHERE est utilisée pour ne rechercher que les lignes contenant l'élément <Warranty> dans le code XML. Une fois encore, le mot clé namespace permet de définir deux préfixes d'espace de noms.

Voici le résultat partiel :

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

Remarque : les méthodes query() et exist() déclarent toutes deux le préfixe PD. Quand de tels cas se présentent, vous pouvez utiliser WITH XMLNAMESPACES pour définir au préalable les préfixes et les utiliser dans la requête.

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