exist() Method (xml Data Type)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Mengembalikan bit yang mewakili salah satu kondisi berikut:

  • 1, mewakili True, jika ekspresi XQuery dalam kueri mengembalikan hasil yang tidak ada. Artinya, ia mengembalikan setidaknya satu simpul XML.

  • 0, mewakili False, jika mengembalikan hasil kosong.

  • NULL jika instans jenis data xml tempat kueri dijalankan berisi NULL.

Sintaksis

exist (XQuery)   

Catatan

Untuk melihat sintaks Transact-SQL untuk SQL Server 2014 (12.x) dan versi yang lebih lama, lihat Dokumentasi versi sebelumnya.

Argumen

XQuery
Adalah ekspresi XQuery, string harfiah.

Keterangan

Catatan

Metode exist() mengembalikan 1 untuk ekspresi XQuery yang mengembalikan hasil yang tidak ada. Jika Anda menentukan fungsi true() atau false() di dalam metode exist(), metode exist() akan mengembalikan 1, karena fungsi true() dan false() mengembalikan Boolean True dan False, masing-masing. Artinya, mereka mengembalikan hasil yang tidak ada sama sekali). Oleh karena itu, exist() akan mengembalikan 1 (True), seperti yang ditunjukkan dalam contoh berikut:

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

Contoh

Contoh berikut menunjukkan cara menentukan metode exist().

Contoh: Menentukan metode exist() terhadap variabel jenis xml

Dalam contoh berikut, @x adalah variabel jenis xml (xml yang tidak dititip) dan @f merupakan variabel jenis bilangan bulat yang menyimpan nilai yang dikembalikan oleh metode exist(). Metode exist() mengembalikan True (1) jika nilai tanggal yang disimpan dalam instans XML adalah 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;  

Dalam membandingkan tanggal dalam metode exist(), perhatikan hal berikut:

  • Kode cast as xs:date? digunakan untuk melemparkan nilai ke jenis xs:date untuk tujuan perbandingan.

  • Nilai atribut @Somedate tidak dititik. Dalam membandingkan nilai ini, secara implisit dilemparkan ke jenis di sisi kanan perbandingan, jenis xs:date .

  • Alih-alih mentransmisikan sebagai xs:date(), Anda dapat menggunakan fungsi konstruktor xs:date(). Untuk informasi selengkapnya, lihat Fungsi Konstruktor (XQuery).

Contoh berikut mirip dengan yang sebelumnya, kecuali memiliki <Somedate> elemen .

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;  

Perhatikan hal berikut ini dari kueri sebelumnya:

  • Metode text() mengembalikan simpul teks yang berisi nilai 2002-01-01yang tidak diketik . (Jenis XQuery adalah xdt:untypedAtomic.) Anda harus secara eksplisit mentransmisikan nilai yang diketik ini dari x ke xsd:date, karena transmisi implisit tidak didukung dalam kasus ini.

Contoh: Menentukan metode exist() terhadap variabel xml yang dititik

Contoh berikut mengilustrasikan penggunaan metode exist() terhadap variabel jenis xml . Ini adalah variabel XML yang diketik, karena menentukan nama kumpulan namespace layanan skema, ManuInstructionsSchemaCollection.

Dalam contoh, dokumen instruksi manufaktur pertama kali ditetapkan ke variabel ini dan kemudian metode exist() digunakan untuk menemukan apakah dokumen menyertakan <>Locationelemen yang nilai atribut LocationID-nya adalah 50.

Metode exist() yang ditentukan terhadap @x variabel mengembalikan 1 (True) jika dokumen instruksi manufaktur menyertakan><Locationelemen yang memiliki .LocationID=50 Jika tidak, metode mengembalikan 0 (False).

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;  

Contoh: Menentukan metode exist() terhadap kolom jenis xml

Kueri berikut mengambil ID model produk yang deskripsi katalognya tidak menyertakan spesifikasi, <Specifications> elemen:

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;  

Perhatikan hal berikut ini dari kueri sebelumnya:

  • Klausa WHERE hanya memilih baris tersebut dari tabel ProductDescription yang memenuhi kondisi yang ditentukan terhadap kolom jenis xml CatalogDescription.

  • Metode exist() dalam klausa WHERE mengembalikan 1 (True) jika XML tidak menyertakan elemen apa punSpecifications<>. Perhatikan penggunaan fungsi not() (XQuery).

  • Fungsi sql:column() (XQuery) digunakan untuk membawa nilai dari kolom non-XML.

  • Kueri ini mengembalikan set baris kosong.

Kueri menentukan metode query() dan exist() dari tipe data xml dan kedua metode ini mendeklarasikan namespace yang sama dalam prolog kueri. Dalam hal ini, Anda mungkin ingin menggunakan WITH XMLNAMESPACES untuk mendeklarasikan awalan dan menggunakannya dalam kueri.

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;  

Lihat Juga

Menambahkan Namespace ke Kueri dengan XMLNAMESPACES
Membandingkan XML Yang Dititik dengan XML Yang Tidak Dititik
Membuat Instans Data XML
Metode Tipe Data xml
Bahasa Modifikasi Data XML (XML DML)