Expressions quantifiées (XQuery)

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 de la clause satisfies doit aboutir à l'un des résultats suivants : 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 some renvoie True si au moins une des valeurs liées par le quantificateur possède un résultat True dans l'expression de satisfaction. La quantification universelle qui utilise every doit posséder True pour toutes les valeurs liées par le quantificateur.

Par exemple, la requête suivante vérifie si chaque élément <Location> possède 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 requis de l'élément <Location>, vous obtenez le résultat attendu :

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

Au lieu d'utiliser la méthode query(), vous pouvez recourir à la méthode value() pour renvoyer le résultat à l'univers relationnel, comme le montre 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 résultat partiel :

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

Limites de la mise en œuvre

Les limites sont les suivantes :

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

Voir aussi

Concepts