Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Berlaku untuk:SQL Server
Seperti yang dijelaskan dalam topik, Ekspresi Jalur di XQuery, langkah sumbu dalam ekspresi jalur menyertakan komponen berikut:
Tes simpul. Untuk informasi selengkapnya, lihat Menentukan Pengujian Simpul dalam Langkah Ekspresi Jalur.
Nol atau lebih predikat. Ini opsional.
Predikat opsional adalah bagian ketiga dari langkah sumbu dalam ekspresi jalur.
Predikat
Predikat digunakan untuk memfilter urutan simpul dengan menerapkan pengujian tertentu. Ekspresi predikat diapit dalam tanda kurung siku dan terikat ke simpul terakhir dalam ekspresi jalur.
Misalnya, asumsikan bahwa nilai parameter SQL (x) dari jenis data xml dideklarasikan, seperti yang ditunjukkan dalam hal berikut:
declare @x xml
set @x = '
<People>
<Person>
<Name>John</Name>
<Age>24</Age>
</Person>
<Person>
<Name>Goofy</Name>
<Age>54</Age>
</Person>
<Person>
<Name>Daffy</Name>
<Age>30</Age>
</Person>
</People>
'
Dalam hal ini, berikut ini adalah ekspresi valid yang menggunakan nilai predikat [1] di masing-masing dari tiga tingkat node yang berbeda:
select @x.query('/People/Person/Name[1]')
select @x.query('/People/Person[1]/Name')
select @x.query('/People[1]/Person/Name')
Perhatikan bahwa dalam setiap kasus, predikat mengikat ke simpul dalam ekspresi jalur tempatnya diterapkan. Misalnya, ekspresi jalur pertama memilih elemen pertama <Name> dalam setiap node /People/Person dan, dengan instans XML yang disediakan, mengembalikan hal berikut:
<Name>John</Name><Name>Goofy</Name><Name>Daffy</Name>
Namun, ekspresi jalur kedua memilih semua <Name> elemen yang berada di bawah node /People/Person pertama. Oleh karena itu, mengembalikan hal berikut:
<Name>John</Name>
Tanda kurung juga dapat digunakan untuk mengubah urutan evaluasi predikat. Misalnya, dalam ekspresi berikut, sekumpulan tanda kurung digunakan untuk memisahkan jalur (/Orang/Orang/Nama) dari predikat [1]:
select @x.query('(/People/Person/Name)[1]')
Dalam contoh ini, urutan di mana predikat diterapkan berubah. Ini karena jalur tertutup pertama kali dievaluasi (/Orang/Orang/Nama) dan kemudian operator predikat [1] diterapkan ke set yang berisi semua simpul yang cocok dengan jalur tertutup. Tanpa tanda kurung, urutan operasi akan berbeda karena [1] diterapkan sebagai pengujian simpul child::Name , mirip dengan contoh ekspresi jalur pertama.
Kuantifier dan Predikat
Kuantifier dapat digunakan dan ditambahkan lebih dari satu kali dalam kurung kurawal predikat itu sendiri. Misalnya, menggunakan contoh sebelumnya, berikut ini adalah penggunaan yang valid dari lebih dari satu kuantifier dalam subekspresi predikat kompleks.
select @x.query('/People/Person[contains(Name[1], "J") and xs:integer(Age[1]) < 40]/Name/text()')
Hasil ekspresi predikat dikonversi ke nilai Boolean dan disebut sebagai nilai kebenaran predikat. Hanya simpul dalam urutan yang nilai kebenaran predikatnya adalah True yang dikembalikan dalam hasil. Semua simpul lainnya dibuang.
Misalnya, ekspresi jalur berikut menyertakan predikat dalam langkah kedua:
/child::root/child::Location[attribute::LocationID=10]
Kondisi yang ditentukan oleh predikat ini diterapkan ke semua <Location> anak simpul elemen. Hasilnya adalah hanya lokasi pusat kerja yang nilai atribut LocationID-nya adalah 10 yang dikembalikan.
Ekspresi jalur sebelumnya dijalankan dalam pernyataan SELECT berikut:
SELECT Instructions.query('
declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
/child::AWMI:root/child::AWMI:Location[attribute::LocationID=10]
')
FROM Production.ProductModel
WHERE ProductModelID=7
Nilai Kebenaran Predikat Komputasi
Aturan berikut diterapkan untuk menentukan nilai kebenaran predikat, sesuai dengan spesifikasi XQuery:
Jika nilai ekspresi predikat adalah urutan kosong, nilai kebenaran predikat adalah False.
Contohnya:
SELECT Instructions.query(' declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions"; /child::AWMI:root/child::AWMI:Location[attribute::LotSize] ') FROM Production.ProductModel WHERE ProductModelID=7Ekspresi jalur dalam kueri ini hanya mengembalikan simpul elemen yang <
Location> memiliki atribut LotSize yang ditentukan. Jika predikat mengembalikan urutan kosong untuk <Location>tertentu, lokasi pusat kerja tersebut tidak dikembalikan dalam hasilnya.Nilai predikat hanya boleh xs:integer, xs:Boolean, atau node*. Untuk node*, predikat mengevaluasi ke True jika ada simpul, dan False untuk urutan kosong. Jenis numerik lainnya, seperti jenis ganda dan float, menghasilkan kesalahan pengetikan statis. Nilai kebenaran predikat ekspresi adalah True jika dan hanya jika bilangan bulat yang dihasilkan sama dengan nilai posisi konteks. Selain itu, hanya nilai literal bilangan bulat dan fungsi last() yang mengurangi kardinalitas ekspresi langkah yang difilter menjadi 1.
Misalnya, kueri berikut mengambil simpul elemen turunan ketiga dari <
Features> elemen .SELECT CatalogDescription.query(' declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription"; declare namespace wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain"; /child::PD:ProductDescription/child::PD:Features/child::*[3] ') FROM Production.ProductModel WHERE ProductModelID=19Perhatikan hal berikut ini dari kueri sebelumnya:
Langkah ketiga dalam ekspresi menentukan ekspresi predikat yang nilainya adalah 3. Oleh karena itu, nilai kebenaran predikat dari ekspresi ini adalah True hanya untuk simpul yang posisi konteksnya adalah 3.
Langkah ketiga juga menentukan karakter kartubebas (*) yang menunjukkan semua simpul dalam pengujian simpul. Namun, predikat memfilter simpul dan hanya mengembalikan simpul di posisi ketiga.
Kueri mengembalikan simpul elemen turunan ketiga dari turunan <
Features> elemen turunan <ProductDescription> elemen dari akar dokumen.
Jika nilai ekspresi predikat adalah satu nilai jenis sederhana dari jenis Boolean, nilai kebenaran predikat sama dengan nilai ekspresi predikat.
Misalnya, kueri berikut ditentukan terhadap variabel jenis xml yang menyimpan instans XML, instans XML survei pelanggan. Kueri mengambil pelanggan yang memiliki anak. Dalam kueri ini, yang akan menjadi <HasChildren>1</HasChildren>.
declare @x xml set @x=' <Survey> <Customer CustomerID="1" > <Age>27</Age> <Income>20000</Income> <HasChildren>1</HasChildren> </Customer> <Customer CustomerID="2" > <Age>27</Age> <Income>20000</Income> <HasChildren>0</HasChildren> </Customer> </Survey> ' declare @y xml set @y = @x.query(' for $c in /child::Survey/child::Customer[( child::HasChildren[1] cast as xs:boolean ? )] return <CustomerWithChildren> { $c/attribute::CustomerID } </CustomerWithChildren> ') select @yPerhatikan hal berikut ini dari kueri sebelumnya:
Ekspresi dalam untuk perulangan memiliki dua langkah, dan langkah kedua menentukan predikat. Nilai predikat ini adalah nilai jenis Boolean. Jika nilai ini True, nilai kebenaran predikat juga True.
Kueri mengembalikan turunan <
Customer> elemen, yang nilai predikatnya adalah True, dari turunan <elemen Survei> dari akar dokumen. Ini adalah hasilnya:<CustomerWithChildren CustomerID="1"/>
Jika nilai ekspresi predikat adalah urutan yang berisi setidaknya satu simpul, nilai kebenaran predikat adalah True.
Misalnya, kueri berikut mengambil ProductModelID untuk model produk yang deskripsi katalog XML-nya mencakup setidaknya satu fitur, elemen turunan <Features> dari elemen, dari namespace yang terkait dengan awalan wm.
SELECT ProductModelID
FROM Production.ProductModel
WHERE CatalogDescription.exist('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
declare namespace wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain";
/child::PD:ProductDescription/child::PD:Features[wm:*]
') = 1
Perhatikan hal berikut ini dari kueri sebelumnya:
Ekspresi jalur di dalam metode exist() menentukan predikat di langkah kedua. Jika ekspresi predikat mengembalikan urutan setidaknya satu fitur, nilai kebenaran ekspresi predikat ini adalah True. Dalam hal ini, karena metode exist() mengembalikan True, ProductModelID dikembalikan.
Filter Pengetikan dan Predikat Statis
Predikat juga dapat memengaruhi jenis ekspresi yang disimpulkan secara statis. Nilai literal bilangan bulat dan fungsi last() mengurangi kardinalitas ekspresi langkah yang difilter menjadi paling banyak satu.