exist()-Methode (XML-Datentyp)

Gibt ein Bit mit folgenden Bedeutungen zurück:

  • 1 bedeutet True, wenn der XQuery-Ausdruck in einer Abfrage ein nicht leeres Ergebnis zurückgibt, d. h. wenn er mindestens einen XML-Knoten zurückgibt.
  • 0 bedeutet False, wenn er ein leeres Ergebnis zurückgibt.
  • NULL, wenn die Instanz vom Datentyp xml, für die die Abfrage ausgeführt wurde, NULL enthält.

Syntax

exist (XQuery) 

Argumente

  • XQuery
    Ein XQuery-Ausdruck, ein Zeichenfolgenliteral.

Beispiele:

A. Angeben der exist()-Methode für eine Variable vom Typ XML

Im folgenden Beispiel stellt @x eine Variable vom Typ xml dar (nicht typisiertes XML) und @f eine Variable vom Typ integer, die den von der exist()-Methode zurückgegebenen Wert speichert. Die exist()-Methode gibt True zurück (1), wenn der in der XML-Instanz gespeicherte Datumswert 2002-01-01 ist.

declare @x xml
declare @f bit
set @x = '<root Somedate = "2002-01-01Z"/>'
set @f = @x.exist('/root[(@Somedate cast as xs:date?) eq xs:date("2002-01-01Z")]')
select @f

Beachten Sie beim Vergleichen von Datumswerten mit der exist()-Methode Folgendes:

  • Zum Vergleichen der Werte wird der Code cast as xs:date? verwendet, um die Werte in Werte vom Typ xs:date umzuwandeln.
  • Der Wert des @Somedate-Attributs ist nicht typisiert. Beim Vergleichen wird der Wert implizit in den Typ auf der rechten Seite des Vergleichs, den xs:date-Datentyp, umgewandelt.
  • Anstelle von cast as xs:date() können Sie die xs:date()-Konstruktorfunktion verwenden. Weitere Informationen finden Sie unter Konstruktorfunktionen (XQuery).

Das folgende Beispiel ist dem vorherigen ähnlich, mit dem Unterschied, dass es ein <Somedate>-Element besitzt.

DECLARE @x xml
DECLARE @f bit
SET @x = '<Somedate>2002-01-01Z</Somedate>'
SET @f = @x.exist('/Somedate[(text()[1] cast as xs:date ?) = xs:date("2002-01-01Z") ]')
SELECT @f

Beachten Sie bei der vorstehenden Abfrage folgende Aspekte:

  • Die text()-Methode gibt einen Textknoten zurück, der den nicht typisierten Wert 2002-01-01 enthält (der Typ der XQuery ist xdt:untypedAtomic). Sie müssen diesen Typ explizit von x zu xsd:date umwandeln, da das implizite Umwandeln in diesem Fall nicht unterstützt wird.

B. Angeben der exist()-Methode für eine typisierte XML-Variable

Das folgende Beispiel veranschaulicht die Verwendung der exist()-Methode für eine Variable vom Typ xml. Es handelt sich hier um eine typisierte XML-Variable, da sie den Namen des Namespace der Schemaauflistung angibt: ManuInstructionsSchemaCollection.

In diesem Beispiel wird dieser Variablen zunächst ein Dokument mit Fertigungsanweisungen zugewiesen. Anschließend wird die exist()-Methode verwendet, um zu bestimmen, ob das Dokument ein <Location>-Element enthält, dessen LocationID-Attributwert 50 ist.

Die für die @x-Variable angegebene exist()-Methode gibt 1 (True), wenn das Dokument mit den Fertigungsanweisungen ein <Location>-Element mit LocationID=50 enthält. Anderenfalls gibt sie 0 (False) zurück.

DECLARE @x xml (Production.ManuInstructionsSchemaCollection)
SELECT @x=Instructions
FROM Production.ProductModel
WHERE ProductModelID=67
--SELECT @x
DECLARE @f int
SET @f = @x.exist(' declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
    /AWMI:root/AWMI:Location[@LocationID=50]
')
SELECT @f

C. Angeben der exist()-Methode für eine Spalte vom Typ XML

Die folgende Abfrage ruft Produktmodell-IDs ab, deren Katalogbeschreibungen keine Spezifikationen, d. h. kein <Specifications>-Element enthalten.

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

Beachten Sie bei der vorstehenden Abfrage folgende Aspekte:

  • Die WHERE-Klausel wählt nur diejenigen Zeilen aus der ProductDescription-Tabelle aus, die die für die CatalogDescription-Spalte vom Typ XML angegebene Bedingung erfüllen.
  • Die exist()-Methode in der WHERE-Klausel gibt 1 (True) zurück, wenn der XML-Code kein <Specifications>-Element enthält. Beachten Sie die Verwendung der not()-Funktion (XQuery).
  • Die sql:column()-Funktion (XQuery) wird zum Einbinden eines Wertes aus einer Spalte verwendet, die nicht vom Typ XML ist.
  • Diese Abfrage gibt ein leeres Rowset zurück.

Die Abfrage gibt die query()- und die exist()-Methode vom XML-Datentyp an. Beide Methoden deklarieren denselben Namespace im Abfrageprolog. In diesem Fall bietet es sich an, WITH XMLNAMESPACES zu verwenden, um das Präfix zu deklarieren und in der Abfrage zu verwenden.

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)]'
    ) = 1

Siehe auch

Konzepte

Hinzufügen von Namespaces mithilfe von WITH XMLNAMESPACES
Typisiertes im Vergleich zu nicht typisiertem XML
XML-Datentyp
Generieren von XML-Instanzen
XML DML (Data Modification Language)
XML-Beispielanwendungen

Andere Ressourcen

xml-Datentypmethoden

Hilfe und Informationen

Informationsquellen für SQL Server 2005