Bagikan melalui


Ekspresi Urutan (XQuery)

Berlaku untuk:SQL Server

SQL Server mendukung operator XQuery yang digunakan untuk membuat, memfilter, dan menggabungkan urutan item. Item bisa menjadi nilai atom atau simpul.

Membuat Urutan

Anda dapat menggunakan operator koma untuk membuat urutan yang menggabungkan item ke dalam satu urutan.

Urutan dapat berisi nilai duplikat. Urutan berlapis, urutan dalam urutan, diciutkan. Misalnya, urutan (1, 2, (3, 4, (5)) menjadi (1, 2, 3, 4, 5). Ini adalah contoh pembuatan urutan.

Contoh A

Kueri berikut mengembalikan urutan lima nilai atom:

declare @x xml  
set @x=''  
select @x.query('(1,2,3,4,5)')  
go  
-- result 1 2 3 4 5  

Kueri berikut mengembalikan urutan dua simpul:

-- sequence of 2 nodes  
declare @x xml  
set @x=''  
select @x.query('(<a/>, <b/>)')  
go  
-- result  
<a />  
<b />  

Kueri berikut mengembalikan kesalahan, karena Anda membuat urutan nilai dan simpul atomik. Ini adalah urutan heterogen dan tidak didukung.

declare @x xml  
set @x=''  
select @x.query('(1, 2, <a/>, <b/>)')  
go  

Contoh B

Kueri berikut membuat urutan nilai atom dengan menggabungkan empat urutan dengan panjang yang berbeda ke dalam satu urutan.

declare @x xml  
set @x=''  
select @x.query('(1,2),10,(),(4, 5, 6)')  
go  
-- result = 1 2 10 4 5 6  

Anda dapat mengurutkan urutan dengan menggunakan FLOWR dan ORDER BY:

declare @x xml  
set @x=''  
select @x.query('for $i in ((1,2),10,(),(4, 5, 6))  
                  order by $i  
                  return $i')  
go  

Anda dapat menghitung item dalam urutan dengan menggunakan fungsi fn:count().

declare @x xml  
set @x=''  
select @x.query('count( (1,2,3,(),4) )')  
go  
-- result = 4  

Contoh C

Kueri berikut ditentukan terhadap kolom AdditionalContactInfo dari jenis xml dalam tabel Kontak. Kolom ini menyimpan informasi kontak tambahan, seperti satu atau beberapa nomor telepon tambahan, nomor pager, dan alamat. Nomor <telepon>, <pager>, dan simpul lainnya dapat muncul di mana saja dalam dokumen. Kueri membuat urutan yang berisi semua <anak nomor telepon> dari simpul konteks, diikuti oleh anak pager<>. Perhatikan penggunaan operator urutan koma dalam ekspresi pengembalian, ($a//act:telephoneNumber, $a//act:pager).

WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes' AS act,  
 'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo' AS aci)  
  
SELECT AdditionalContactInfo.query('  
   for $a in /aci:AdditionalContactInfo   
   return ($a//act:telephoneNumber, $a//act:pager)  
') As Result  
FROM Person.Contact  
WHERE ContactID=3  

Ini adalah hasilnya:

<act:telephoneNumber xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">  
  <act:number>333-333-3333</act:number>  
</act:telephoneNumber>  
<act:telephoneNumber xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">  
  <act:number>333-333-3334</act:number>  
</act:telephoneNumber>  
<act:pager xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">  
  <act:number>999-555-1244</act:number>  
  <act:SpecialInstructions>  
Page only in case of emergencies.  
</act:SpecialInstructions>  
</act:pager>  

Urutan Pemfilteran

Anda dapat memfilter urutan yang dikembalikan oleh ekspresi dengan menambahkan predikat ke ekspresi. Untuk informasi selengkapnya, lihat Ekspresi Jalur (XQuery). Misalnya, kueri berikut mengembalikan urutan tiga <a> node elemen:

declare @x xml  
set @x = '<root>  
<a attrA="1">111</a>  
<a></a>  
<a></a>  
</root>'  
SELECT @x.query('/root/a')  

Ini adalah hasilnya:

<a attrA="1">111</a>  
<a />  
<a />  

Untuk mengambil hanya <a> elemen yang memiliki atribut attrA, Anda dapat menentukan filter dalam predikat. Urutan yang dihasilkan hanya akan memiliki satu <a> elemen.

declare @x xml  
set @x = '<root>  
<a attrA="1">111</a>  
<a></a>  
<a></a>  
</root>'  
SELECT @x.query('/root/a[@attrA]')  

Ini adalah hasilnya:

<a attrA="1">111</a>  

Untuk informasi selengkapnya tentang cara menentukan predikat dalam ekspresi jalur, lihat Menentukan Predikat dalam Langkah Ekspresi Jalur.

Contoh berikut membangun ekspresi urutan subtrees lalu menerapkan filter ke urutan.

declare @x xml  
set @x = '  
<a>  
  <c>C under a</c>  
</a>  
<b>    
   <c>C under b</c>  
</b>  
<c>top level c</c>  
<d></d>  
'  

Ekspresi dalam (/a, /b) membangun urutan dengan subtrees /a dan /b dan dari urutan yang dihasilkan, ekspresi memfilter elemen <c>.

SELECT @x.query('  
  (/a, /b)/c  
')  

Ini adalah hasilnya:

<c>C under a</c>  
<c>C under b</c>  

Contoh berikut menerapkan filter predikat. Ekspresi menemukan elemen <a> dan>b< yang berisi elemen .<c>

declare @x xml  
set @x = '  
<a>  
  <c>C under a</c>  
</a>  
<b>    
   <c>C under b</c>  
</b>  
  
<c>top level c</c>  
<d></d>  
'  
SELECT @x.query('  
  (/a, /b)[c]  
')  

Ini adalah hasilnya:

<a>  
  <c>C under a</c>  
</a>  
<b>  
  <c>C under b</c>  
</b>  

Batasan Implementasi

Ini adalah batasannya:

  • Ekspresi rentang XQuery tidak didukung.

  • Urutan harus homogen. Secara khusus, semua item dalam urutan harus berupa simpul atau nilai atomik. Ini diperiksa secara statis.

  • Menggabungkan urutan node dengan menggunakan operator union, intersect, atau except tidak didukung.

Lihat Juga

Ekspresi XQuery