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.
Hinweis |
---|
Die exist()-Methode gibt 1 für den XQuery-Ausdruck zurück, der ein nicht leeres Ergebnis zurückgibt. Wenn Sie die true()- oder false()-Funktionen in der exist()-Methode angeben, gibt die exist()-Methode 1 zurück, da die Funktionen true() und false() den booleschen Wert True bzw. False zurückgeben. D. h., sie geben ein nicht leeres Ergebnis zurück. Daher gibt exist() den Wert 1 (True) zurück, wie im folgenden Beispiel gezeigt: |
declare @x xml
set @x=''
select @x.exist('true()')
Syntax
exist (XQuery)
Argumente
- XQuery
Ein XQuery-Ausdruck, ein Zeichenfolgenliteral.
Beispiele:
In den folgenden Beispielen wird veranschaulicht, wie die exist()-Methode angegeben wird.
Beispiel: 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 hinsichtlich der vorherigen Abfrage Folgendes:
- 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.
Beispiel: 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
Beispiel: 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 hinsichtlich der vorherigen Abfrage Folgendes:
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 Werts 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