Dizi İfadeleri (XQuery)

Şunlar için geçerlidir: SQL Server

SQL Server, bir dizi öğe oluşturmak, filtrelemek ve birleştirmek için kullanılan XQuery operatörlerini destekler. Bir eşya atomik değer veya düğüm olabilir.

Dizileri Oluşturma

Virgül operatörünü kullanarak öğeleri tek bir diziye birleştiren bir dizi oluşturabilirsiniz.

Bir dizide tekrarlanan değerler bulunabilir. İç içe dizileri olan bir dizi içinde bir dizi birleştirilir. Örneğin, (1, 2, (3, 4, (5))) dizisi (1, 2, 3, 4, 5) olur. Bunlar dizileri oluşturma örnekleridir.

Örnek A

Aşağıdaki sorgu, beş atomik değerden oluşan bir diziyi döndürür:

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

Aşağıdaki sorgu iki düğümden oluşan bir dizi döndürür:

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

Aşağıdaki sorgu hata döndürür, çünkü atomik değerler ve düğümler dizisi oluşturuyorsunuz. Bu heterojen bir dizidir ve desteklenmez.

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

Örnek B

Aşağıdaki sorgu, farklı uzunluktaki dört diziyi tek bir dizide birleştirerek atomik değerler dizisini oluşturur.

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

Diziyi FLOWR ve ORDER BY kullanarak sıralayabilirsiniz:

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

Dizide bulunan öğeleri fn:count() fonksiyonunu kullanarak sayabilirsiniz.

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

Örnek C

Aşağıdaki sorgu, Contact tablosunda xml tipinin AdditionalContactInfo sütununa karşı belirtilmiştir. Bu sütun, bir veya daha fazla ek telefon numarası, pager numarası ve adres gibi ek iletişim bilgilerini depolar. TelefonNumara<>, <çağırıcı> ve diğer düğümler belgenin herhangi bir yerinde görünebilir. Sorgu, bağlam düğümünün tüm <telefonNumber> çocuklarını ve ardından <pager> çocuklarını içeren bir dizi oluşturur. Dönüş ifadesinde virgül dizisi operatörünün kullanılmasına dikkat edin. ($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  

Sonuç şu şekildedir:

<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>  

Filtreleme Dizileri

Bir ifadeyle döndürülen diziyi ifadeye bir yüklem ekleyerek filtreleyebilirsiniz. Daha fazla bilgi için Yol İfadeleri (XQuery) bölümüne bakınız. Örneğin, aşağıdaki sorgu üç <a> eleman düğümlerinden oluşan bir diziyi döndürür:

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

Sonuç şu şekildedir:

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

Yalnızca <a> attrA özniteliğine sahip elemanları almak için, önlemde bir filtre belirtebilirsiniz. Ortaya çıkan dizide yalnızca bir <a> eleman olur.

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

Sonuç şu şekildedir:

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

Bir yol ifadesinde predikat nasıl belirtileceği hakkında daha fazla bilgi için Yol İfadesi Adımında Belirtmek başlıklarına bakınız.

Aşağıdaki örnek, alt ağaçların bir dizi ifadesini oluşturur ve ardından diziye bir filtre uygular.

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>  
'  

Ifade, (/a, /b) alt ağaçlardan /a oluşan bir dizi oluşturur ve /b ortaya çıkan diziden ifade, elemanı <c>filtreler.

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

Sonuç şu şekildedir:

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

Aşağıdaki örnek bir önlem filtresi uygular. İfade, <>aeleman içeren <>celemanlar bulur <b> ve bu öğeler .

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]  
')  

Sonuç şu şekildedir:

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

Uygulama Sınırlamaları

Sınırlamalar şunlardır:

  • XQuery aralığı ifadesi desteklenmemektedir.

  • Dizileri homojen olmalıdır. Özellikle, bir dizideki tüm öğeler ya düğüm ya da atomik değerler olmalıdır. Bu, statik olarak denetlendi.

  • Düğüm dizilerini birleştirmek, kesişme veya hariç operatörü kullanılarak birleştirilmek desteklenmez.