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 fournit des exemples de requêtes XQuery impliquant des instances XML stockées dans différentes colonnes de type xml dans la base de données AdventureWorks. Pour obtenir une vue d'ensemble de chacune de ces colonnes, consultez Représentation du type de données xml dans 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 limites sont les suivantes :
- La fonction not() ne prend en charge que les arguments de type xs:boolean ou node()*, ou la séquence vide.