Fonction not (XQuery)

Renvoie TRUE si la valeur booléenne effective de $arg est false, et FALSE si cette valeur est true.

Syntaxe

fn:not($arg as item()*) as xs:boolean

Arguments

  • $arg
    Séquence d'éléments pour lesquels existe une valeur booléenne effective.

Exemples

Cette rubrique propose des exemples de XQuery relatifs à des instances XML stockées dans différentes colonnes de type xml tirées de la base de données AdventureWorks.

A.Utilisation de la fonction XQuery not() pour rechercher les modèles de produit dont la description de catalogue ne comprend pas l'élément <Specifications>.

La requête suivante construit le document XML qui contient les ID des modèles de produit dont la description de catalogue ne comprend pas l'élément <Specifications>.

WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS pd)
SELECT ProductModelID, CatalogDescription.query('
       <Product 
           ProductModelID="{ sql:column("ProductModelID") }"
        />
') as Result
FROM Production.ProductModel
WHERE CatalogDescription.exist('
     /pd:ProductDescription[not(pd:Specifications/*)]  '
     ) = 0

Notez les points suivants par rapport à la requête ci-dessus :

  • Étant donné que le document utilise des espaces de noms, l'exemple recourt à l'instruction WITH NAMESPACES. Une autre option consiste à utiliser le mot clé declare namespace dans le prologue XQuery pour définir le préfixe.

  • La requête construit ensuite le document XML qui comprend l'élément <Product> et son attribut ProductModelID.

  • La clause WHERE utilise la méthode exist() (type de données XML) pour filtrer les lignes. La méthode exist() renvoie True s'il existe des éléments <ProductDescription> dépourvus d'éléments enfants <Specification>. Notez l'utilisation de la fonction not().

Ce jeu de résultats est vide car chaque description de catalogue de modèle de produit comprend l'élément <Specifications>.

B.Utilisation de la fonction XQuery not() pour extraire les sites de production dépourvus de l'attribut MachineHours

La requête suivante porte sur la colonne Instructions. Cette colonne stocke les instructions de fabrication des modèles de produit.

Pour un modèle de produit particulier, la requête extrait les sites de production qui ne spécifient pas l'attribut MachineHours. En d'autres termes, l'attribut MachineHours n'est pas spécifié pour l'élément <Location>.

SELECT ProductModelID, Instructions.query('
declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions" ;
     for $i in /AWMI:root/AWMI:Location[not(@MachineHours)]
     return
       <Location LocationID="{ $i/@LocationID }" 
                   LaborHrs="{ $i/@LaborHours }" >
        </Location>
') as Result
FROM Production.ProductModel
WHERE ProductModelID=7 

Notez les points suivants par rapport à la requête ci-dessus :

  • Le mot clé declare namespace dans le prologue XQuery définit le préfixe d'espace de noms des instructions de fabrication d'Adventure Works. Il représente le même espace de noms que celui utilisé dans le document des instructions de fabrication.

  • Dans la requête, le prédicat not(@MachineHours) renvoie True s'il n'y a pas d'attribut MachineHours.

Voici le résultat obtenu :

ProductModelID Result 
-------------- --------------------------------------------
7              <Location LocationID="30" LaborHrs="1"/>
               <Location LocationID="50" LaborHrs="3"/>
               <Location LocationID="60" LaborHrs="4"/>

Limites de la mise en œuvre

Les limitations suivantes s'appliquent :

  • La fonction not() ne prend en charge que les arguments de type xs:boolean ou node()*, ou la séquence vide.

Voir aussi

Référence

Fonctions XQuery impliquant le type de données xml