not-Funktion (XQuery)
Gibt TRUE zurück, wenn der effektive boolesche Wert von $arg FALSE ist; gibt FALSE zurück, wenn der effektive boolesche Wert von $arg TRUE ist.
Syntax
fn:not($arg as item()*) as xs:boolean
Argumente
- $arg
Eine Elementsequenz, für die es einen effektiven booleschen Wert gibt.
Beispiele:
Dieses Thema stellt XQuery-Beispiele für XML-Instanzen bereit, die in verschiedenen Spalten vom Typ xml in der AdventureWorks-Datenbank gespeichert werden. Eine Übersicht über diese Spalten finden Sie unter Darstellung des xml-Datentyps in der AdventureWorks-Datenbank.
A. Verwenden der not()-XQuery-Funktion zum Suchen von Produktmodellen, deren Katalogbeschreibungen kein <Specifications>-Element enthalten.
Die folgende Abfrage konstruiert XML-Daten, die die Produktmodell-IDs für Produktmodelle enthalten, deren Katalogbeschreibungen kein <Specifications>-Element enthalten.
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
Beachten Sie hinsichtlich der vorherigen Abfrage Folgendes:
Da das Dokument Namespaces verwendet, wird in diesem Beispiel die WITH NAMESPACES-Anweisung verwendet. Eine Alternative dazu wäre die Verwendung des declare namespace-Schlüsselworts im XQuery-Prolog, um das Präfix zu definieren.
Anschließend konstruiert die Abfrage die XML-Daten, die das <Product>-Element und dessen ProductModelID-Attribut enthalten.
Die WHERE-Klausel verwendet die exist()-Methode (XML-Datentyp), um die Zeilen zu filtern. Die exist()-Methode gibt True zurück, wenn <ProductDescription>-Elemente vorhanden sind, die keine untergeordneten <Specification>-Elemente besitzen. Beachten Sie die Verwendung der not()-Funktion.
Dieses Resultset ist leer, da die Katalogbeschreibungen aller Produktmodelle ein <Specifications>-Element enthalten.
B. Verwenden der not()-XQuery-Funktion zum Abrufen der Arbeitsplatzstandorte, die kein MachineHours-Attribut besitzen
Die folgende Abfrage wird beispielsweise für die Instructions-Spalte angegeben. Diese Spalte speichert Anweisungen zur Fertigung der Produktmodelle.
Die Abfrage ruft Arbeitsplatzstandorte, für die kein MachineHours-Attribut angegeben ist, für ein bestimmtes Produktmodell ab. Dies bedeutet, dass kein MachineHours-Attribut für das <Location>-Element angegeben ist.
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
Beachten Sie in der vorhergehenden Abfrage Folgendes:
Der declare-Namespace im XQuery-Prolog definiert das Namespacepräfix der Fertigungsanweisungen in Adventure Works. Dieser Namespace ist mit dem in dem Fertigungsanweisungsdokument verwendeten identisch.
In der Abfrage gibt das not(@MachineHours)-Prädikat True zurück, wenn das MachineHours-Attribut nicht vorhanden ist.
Dies ist das Ergebnis:
ProductModelID Result
-------------- --------------------------------------------
7 <Location LocationID="30" LaborHrs="1"/>
<Location LocationID="50" LaborHrs="3"/>
<Location LocationID="60" LaborHrs="4"/>
Implementierungseinschränkungen
Die folgenden Einschränkungen sind zu beachten:
- Die not()-Funktion unterstützt nur Argumente vom Typ xs:boolean, node()* oder eine leere Sequenz.