Aracılığıyla paylaş


exist() Yöntemi (xml Veri Türü)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiMicrosoft Fabric'te SQL veritabanı

Aşağıdaki koşullardan birini temsil eden bir bit döndürür:

  • 1, Doğru'yu temsil eder, eğer bir sorgudaki XQuery ifadesi boş olmayan bir sonuç verirse. Yani, en az bir XML düğümü döndürür.

  • 0, yanlış'yı temsil eder, eğer boş bir sonuç döndürürse.

  • NULL olarak sorgu çalıştırıldığı xml veri tipi örneği NULL içeriyorsa.

Sözdizimi

exist (XQuery)   

Arguments

XQuery
XQuery ifadesi, bir dize literalidir.

Açıklamalar

Uyarı

exist() yöntemi, boş olmayan bir sonuç veren XQuery ifadesi için 1 döndürür. exist() yöntemi içinde true() veya false() fonksiyonlarını belirtirseniz, exist() yöntemi 1 döndürür, çünkü true() ve false() fonksiyonları sırasıyla Boolean True ve False döndürür. Yani, boş olmayan bir sonuç döndürüyorlar). Dolayısıyla, exist() 1 (Doğru) döndürür, aşağıdaki örnekte gösterildiği gibi:

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

Örnekler

Aşağıdaki örnekler, exist() metodunun nasıl belirleneceğini gösterir.

Örnek: exist() metodunun xml tipi değişkene karşı belirtilmesi

Aşağıdaki örnekte, @x bir xml tipi değişkendir (tipsiz xml) ve @fexist() yöntemiyle döndürülen değeri depolayan tamsayı tipi değişkendir. exist() yöntemi, XML örneğinde saklanan tarih değeri ise 2002-01-01True (1) döndürür.

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;  

exist() yönteminde tarihleri karşılaştırırken aşağıdakilere dikkat edin:

  • Kod cast as xs:date? , karşılaştırma amacıyla değeri xs:date türüne dökmek için kullanılır.

  • @Somedate özniteliğinin değeri tipsizdir. Bu değeri karşılaştırırken, karşılaştırmanın sağ tarafındaki tipe, yani xs:date tipine örtük olarak atılır.

  • xs:date() olarak dökmek yerine, xs:date() yapıcı fonksiyonunu kullanabilirsiniz. Daha fazla bilgi için Constructor Functions (XQuery) bölümüne bakınız.

Aşağıdaki örnek önceki örnekle benzer, ancak bir <Somedate> elemanı vardır.

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;  

Önceki sorgudan aşağıdakilere dikkat edin:

  • text() yöntemi, tiplenmemiş değeri 2002-01-01içeren bir metin düğümü döndürür. (XQuery tipi xdt:untypedAtomic'tir.) Bu tiplenen değeri x'ten xsd:date olarak açıkça kullanmalısınız, çünkü bu durumda örtük casting desteklenmez.

Örnek: Tiplenmiş bir xml değişkenine karşı exist() yöntemini belirtmek

Aşağıdaki örnek, exist() yönteminin xml tipi değişkene karşı kullanımını göstermektedir. Bu, şema isim alanı koleksiyon adını belirttiği için tiplenmiş bir XML değişkenidir, ManuInstructionsSchemaCollection.

Örnekte, üretim talimatları belgesi önce bu değişkene atanır ve ardından exist() yöntemi kullanılarak belgenin < özellik değeri 50 olan bir Location> öğe içerip içermediğini bulur.

Değişkene karşı @x yöntemi, üretim talimatları belgesinde<Location>bir LocationID=50eleman içeriyorsa 1 (Doğru) döner. Aksi takdirde, yöntem 0 (Yanlış) döndürür.

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;  

Örnek: exist() metodunun xml tipi bir sütunla belirtilmesi

Aşağıdaki sorgu, katalog açıklamalarında spesifikasyon öğesi <Specifications> olmayan ürün model kimliklerini alır:

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;  

Önceki sorgudan aşağıdakilere dikkat edin:

  • WHERE maddesi, yalnızca ProductDescription tablosundan CatalogDescription xml tipi sütununa karşı belirtilen koşulu karşılayan satırları seçer.

  • WHERE maddesindeki exist() yöntemi, XML herhangi bir <Specifications> eleman içermiyorsa 1 (True) döndürür. not() fonksiyonunun (XQuery) kullanımına dikkat edin.

  • sql:column() fonksiyonu (XQuery) fonksiyonu, XML olmayan bir sütundan değeri almak için kullanılır.

  • Bu sorgu boş bir satır kümesi döndürür.

Sorgu, xml veri tipine ait query() ve exist() metodlarını belirtir ve her iki yöntem de sorgu prologunda aynı isim alanlarını bildirir. Bu durumda, öneki ilan etmek ve sorguda kullanmak için WITH XMLNAMESPACES kullanmayı tercih edebilirsiniz.

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;  

Ayrıca Bkz.

WITH XMLNAMESPACES ile Sorgulara Ad Alanları Ekleme
Türlü XML'i Türsüz XML ile Karşılaştır
XML Verisi Örnekleri Oluşturmak
xml Veri Türü Yöntemleri
XML Veri Değiştirme Dili (XML DML)