Udostępnij przez


exist() Method (typ danych xml)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBaza danych SQL w usłudze Microsoft Fabric

Zwraca bit , który reprezentuje jeden z następujących warunków:

  • 1, reprezentujący True, jeśli wyrażenie XQuery w zapytaniu zwraca wynik niepusty. To znaczy, zwraca przynajmniej jeden węzeł XML.

  • 0, reprezentująca Fałszywe, jeśli zwraca pusty wynik.

  • NULL jeśli instancja typu xml, na której wykonano zapytanie, zawiera NULL.

Składnia

exist (XQuery)   

Arguments

XQuery
To wyrażenie XQuery, czyli dosłowny łańcuch znaków.

Uwagi

Uwaga / Notatka

Metoda exist() zwraca 1 dla wyrażenia XQuery, które zwraca wynik niepusty. Jeśli określisz funkcje true() lub false() w metodzie exist(), metoda exist() zwróci 1, ponieważ funkcje true() i false() zwracają odpowiednio Boolean True i False. To znaczy, zwracają wynik niepusty). Dlatego exist() zwróci 1 (True), jak pokazano w następującym przykładzie:

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

Przykłady

Poniższe przykłady pokazują, jak określić metodę exist().

Przykład: Określenie metody exist() względem zmiennej typu xml

W poniższym przykładzie jest @x zmienną typu xml (nietypowany xml) i @f jest zmienną typu całkowitoliczbowego, która przechowuje wartość zwracaną przez metodę exist(). Metoda exist() zwraca True (1), jeśli wartość daty zapisana w instancji XML to 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;  

Porównując daty w metodzie exist(), zwróć uwagę na następujące rzeczy:

  • Kod służy cast as xs:date? do przypisania wartości do typu xs:date w celu porównania.

  • Wartość atrybutu @Somedate jest nietypowana. Porównując tę wartość, jest ona domyślnie przypisana do typu po prawej stronie porównania, czyli typu xs:date .

  • Zamiast rzucać jako xs:date(), możesz użyć funkcji konstruktora xs:date(). Więcej informacji można znaleźć w sekcji Funkcje konstruktora (XQuery).

Poniższy przykład jest podobny do poprzedniego, z tą różnicą, że zawiera element.<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;  

Zwróć uwagę na następujące elementy z poprzedniego zapytania:

  • Metoda text() zwraca węzeł tekstowy zawierający wartość 2002-01-01nietypowaną . (Typ XQuery to xdt:untypedAtomic.) Musisz wyraźnie przerzucić tę typową wartość z x na xsd:date, ponieważ w tym przypadku nie jest obsługiwane implicitne casting.

Przykład: Określenie metody exist() na typowanej zmiennej xml

Poniższy przykład ilustruje użycie metody exist() wobec zmiennej typu xml . Jest to typowa zmienna XML, ponieważ określa nazwę zbioru przestrzeni nazw schematu, ManuInstructionsSchemaCollection.

W przykładzie dokument instrukcji produkcyjnej jest najpierw przypisany do tej zmiennej, a następnie używa się metody exist() do ustalenia, czy dokument zawiera <Location> element, którego wartość atrybutu LocationID wynosi 50.

Metoda exist() określona względem @x zmiennej zwraca 1 (True), jeśli dokument instrukcji produkcyjnej zawiera element,<Location>który ma .LocationID=50 W przeciwnym razie metoda zwraca 0 (Fałszywe).

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;  

Przykład: Określenie metody exist() względem kolumny typu xml

Następujące zapytanie pobiera identyfikatory modeli produktu, których opisy katalogowe nie zawierają specyfikacji, <Specifications> elementu:

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;  

Zwróć uwagę na następujące elementy z poprzedniego zapytania:

  • Klauzula WHERE wybiera tylko te wiersze z tabeli ProductDescription , które spełniają warunek określony względem kolumny typu xml CatalogDescription .

  • Metoda exist() w klauzuli WHERE zwraca 1 (True), jeśli XML nie zawiera żadnego <Specifications> elementu. Zwróć uwagę na użycie funkcji not() (XQuery).

  • Funkcja sql:column() (XQuery) służy do pobierania wartości z kolumny niebędącej XML.

  • To zapytanie zwraca pusty zestaw wierszy.

Zapytanie określa metody query() i exist() dla typu danych xml, a obie te metody deklarują te same przestrzenie nazw w prologu zapytania. W takim przypadku możesz chcieć użyć przestrzeni WITH XML, aby zadeklarować prefiks i użyć go w zapytaniu.

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;  

Zobacz też

Dodawanie przestrzeni nazw do zapytań za pomocą funkcji XMLNAMESPACES
Porównaj typizowane XML z nietypizowanym XML
tworzenie wystąpień danych XML
metody typów danych xml
języka modyfikacji danych XML (XML DML)