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

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Spécifie une requête Xml sur 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')  

Remarque

Pour afficher la syntaxe Transact-SQL pour SQL Server 2014 (12.x) et versions antérieures, consultez la Documentation sur les versions antérieures.

Arguments

XQuery
Expression de requête Xml 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.

R. 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 Xml portant sur le document.

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

La sortie suivante montre le résultat :

<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 Xml 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 de la requête précédente :

  • La colonne CatalogDescription est de type xml, ce qui signifie qu’elle dispose d’une collection de schémas associée. Dans le prologue de la requête Xml, le mot clé namespace définit le préfixe utilisé plus loin dans le corps de la requête.

  • La méthode query() construit un élément XML <Product> qui a un attribut ProductModelID dans lequel la valeur de l’attribut ProductModelID est récupérée à partir 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 ne recherche que les lignes contenant l’élément <Warranty> dans le code XML. Une fois encore, le mot clé namespace définit deux préfixes d’espace de noms.

La sortie suivante montre le résultat partiel :

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

Notez que 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;

Voir aussi

Ajouter des espaces de noms aux requêtes avec WITH XMLNAMESPACES
Comparer du XML typé et du XML non typé
Créer des instances de données XML
Méthodes de type de données xml
Langage de modification de données XML (XML DML)