Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL 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;