Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Baza 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)