Partager via


Expressions quantifiées (XQuery)

S’applique à :SQL Server

Les quantificateurs existentiels et universels spécifient différentes sémantiques pour les opérateurs booléens appliqués à deux séquences. Cela est illustré par le tableau suivant.

Quantificateur existentiel
Soient deux séquences ; si un élément de la première séquence a une correspondance dans la seconde séquence, en fonction de l'opérateur de comparaison utilisé, la valeur renvoyée est True.

Quantificateur universel
Soient deux séquences ; si chaque élément de la première séquence a une correspondance dans la seconde séquence, la valeur renvoyée est True.

XQuery prend en charge les expressions quantifiées de la forme suivante :

( some | every ) <variable> in <Expression> (,...) satisfies <Expression>  

Vous pouvez utiliser ces expressions dans une requête pour appliquer explicitement une quantification existentielle ou universelle à une expression sur une ou plusieurs séquences. Dans SQL Server, l’expression dans la satisfies clause doit produire l’une des valeurs suivantes : une séquence de nœuds, une séquence vide ou une valeur booléenne. La valeur booléenne effective du résultat de cette expression est utilisée dans la quantification. La quantification existentielle qui utilise certaines renvoie la valeur True si au moins l’une des valeurs liées par le quantificateur a un résultat True dans l’expression de satisfaction. La quantification universelle qui utilise chaque doit avoir True pour toutes les valeurs liées par le quantificateur.

Par exemple, la requête suivante vérifie chaque <élément Location> pour voir s’il a un attribut LocationID.

SELECT Instructions.query('  
     declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
        if (every $WC in //AWMI:root/AWMI:Location   
            satisfies $WC/@LocationID)  
        then  
             <Result>All work centers have workcenterLocation ID</Result>  
         else  
             <Result>Not all work centers have workcenterLocation ID</Result>  
') as Result  
FROM Production.ProductModel  
where ProductModelID=7  

Étant donné que LocationID est un attribut obligatoire de l’élément <Location> , vous recevez le résultat attendu :

<Result>All work centers have Location ID</Result>   

Au lieu d’utiliser la méthode query(), vous pouvez utiliser la méthode value() pour retourner le résultat au monde relationnel, comme indiqué dans la requête suivante. La requête renvoie True si tous les sites de production possèdent l'attribut LocationID. Sinon, elle renvoie False.

SELECT Instructions.value('  
     declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
        every $WC in  //AWMI:root/AWMI:Location   
            satisfies $WC/@LocationID',   
  'nvarchar(10)') as Result  
FROM Production.ProductModel  
where ProductModelID=7  

La requête suivante vérifie si l'une des images de produit est petite. Dans le document XML du catalogue des produits, différents angles sont stockés pour chaque image de produit de taille différente. Vous pouvez faire en sorte que chaque document XML de catalogue de produits comprenne au moins une image de petite taille. La requête suivante effectue cette opération :

SELECT ProductModelID, CatalogDescription.value('  
     declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
     some $F in /PD:ProductDescription/PD:Picture  
        satisfies $F/PD:Size="small"', 'nvarchar(20)') as SmallPicturesStored  
FROM Production.ProductModel  
WHERE ProductModelID = 19  

Voici un extrait du résultat :

ProductModelID SmallPicturesStored   
-------------- --------------------  
19             true        

Limites de mise en œuvre

Les limitations suivantes s'appliquent :

  • L'assertion de type n'est pas prise en charge pour la liaison de la variable dans les expressions quantifiées.

Voir aussi

Expressions XQuery