exist() Method (xml datový typ)

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL databáze v Microsoft Fabric

Vrací bit , který reprezentuje jednu z následujících podmínek:

  • 1, reprezentující True, pokud výraz XQuery v dotazu vrací neprázdný výsledek. To znamená, že vrací alespoň jeden XML uzel.

  • 0, což představuje Nepravdivé, pokud vrací prázdný výsledek.

  • NULL pokud instance xml datového typu, na které byl dotaz vykonán, obsahuje NULL.

Syntaxe

exist (XQuery)   

Arguments

XQuery
Je výraz XQuery, tedy doslovný řetězec.

Poznámky

Poznámka:

Metoda exist() vrací 1 pro výraz XQuery, který vrací neprázdný výsledek. Pokud zadáte funkce true() nebo false() uvnitř metody exist(), metoda exist() vrátí 1, protože funkce true() a false() vrátí Booleovskou hodnotu True a False. To znamená, že vracejí neprázdný výsledek). Proto exist() vrátí 1 (True), jak ukazuje následující příklad:

DECLARE @x XML;  
SET @x='';  
SELECT @x.exist('true()');   

Examples

Následující příklady ukazují, jak specifikovat metodu exist().

Příklad: Specifikace metody exist() proti XML typové proměnné

V následujícím příkladu @x je XML typová proměnná (netypovaný xml) a je celočíselná typová proměnná@f, která uchovává hodnotu vrácenou metodou exist(). Metoda exist() vrací True (1), pokud je hodnota data uložená v XML instanci .2002-01-01

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;  

Při porovnávání dat v metodě exist() si všimněte následujícího:

  • Kód cast as xs:date? se používá k převedení hodnoty do typu xs:date pro účely porovnání.

  • Hodnota atributu @Somedate není typovaná. Při porovnání této hodnoty je implicitně převedena na typ na pravé straně porovnání, typ xs:date .

  • Místo castování jako xs:date() můžete použít konstruktorovou funkci xs:date(). Pro více informací viz Konstruktorové funkce (XQuery).

Následující příklad je podobný předchozímu, ale má prvek <Somedate> .

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;  

Všimněte si následujících věcí z předchozího dotazu:

  • Metoda text() vrací textový uzel, který obsahuje netypovanou hodnotu 2002-01-01. (Typ XQuery je xdt:untypedAtomic.) Musíte explicitně převést tuto typovanou hodnotu z x na xsd:date, protože implicitní casting v tomto případě není podporován.

Příklad: Specifikace metody exist() proti typované xml proměnné

Následující příklad ilustruje použití metody exist()proti xml typové proměnné. Jedná se o typovanou XML proměnnou, protože určuje název kolekce jmenného prostoru schématu, ManuInstructionsSchemaCollection.

V příkladu je nejprve přiřazen dokument výrobních instrukcí této proměnné a poté se používá metoda exist() k zjištění, zda dokument obsahuje prvek <Location> , jehož hodnota atributu LocationID je 50.

Metoda exist() zadaná proti @x proměnné vrací 1 (True), pokud dokument výrobních instrukcí obsahuje prvek<Location>, který má .LocationID=50 Jinak metoda vrací 0 (Nepravda).

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;  

Příklad: Specifikace metody exist() proti sloupci typu xml

Následující dotaz získává ID produktových modelů, jejichž katalogové popisy neobsahují specifikace, <Specifications> prvek:

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;  

Všimněte si následujících věcí z předchozího dotazu:

  • Klauzule WHERE vybírá pouze ty řádky z tabulky ProductDescription , které splňují podmínku specifickou vůči sloupci typu xml CatalogDescription .

  • Metoda exist() v klauzuli WHERE vrací 1 (True), pokud XML neobsahuje žádný <Specifications> prvek. Všimněte si použití funkce not() (XQuery).

  • Funkce sql:column() (XQuery) se používá k načtení hodnoty z ne-XML sloupce.

  • Tento dotaz vrací prázdnou sadu řádků.

Dotaz specifikuje metody query() a exist( ) pro xml datový typ a obě tyto metody deklarují stejné jmenné prostory v prologu dotazu. V takovém případě můžete chtít použít WITH XMLNAMESPACES k deklaraci prefixu a použít ji v dotazu.

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;