Share via


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 xml -Typ in der AdventureWorks2008R2-Datenbank gespeichert werden. Eine Übersicht über diese Spalten finden Sie unter Darstellung des xml-Datentyps in der AdventureWorks2008R2-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, dass die not()-Funktion verwendet wird.

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-Ergebnis

-------------- --------------------------------------------

7 <Location LocationID="30" LaborHrs="1"/>

<Location LocationID="50" LaborHrs="3"/>

<Location LocationID="60" LaborHrs="4"/>

Implementierungseinschränkungen

Die folgenden Einschränkungen sind vorhanden:

  • Die not() -Funktion unterstützt nur Argumente vom Typ xs:boolean, node()* oder eine leere Sequenz.