Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
XQuery'deki Yol İfadeleri konusunda açıklandığı gibi, yol ifadesindeki bir eksen adımı aşağıdaki bileşenleri içerir:
Düğüm testi. Daha fazla bilgi için bkz. Yol İfade Adımında Düğüm Testi Belirtme.
Sıfır veya daha fazla koşul. Bu isteğe bağlıdır.
İsteğe bağlı koşul, yol ifadesindeki eksen adımının üçüncü bölümüdür.
Yüklemler
Bir koşul, belirtilen testi uygulayarak bir düğüm dizisini filtrelemek için kullanılır. Koşul ifadesi köşeli ayraç içine alınır ve yol ifadesindeki son düğüme bağlıdır.
Örneğin, xml veri türünün SQL parametre değerinin (x) aşağıda gösterildiği gibi bildirildiğini varsayalım:
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>
'
Bu durumda, üç farklı düğüm düzeyinin her birinde [1] koşul değeri kullanan geçerli ifadeler aşağıdadır:
select @x.query('/People/Person/Name[1]')
select @x.query('/People/Person[1]/Name')
select @x.query('/People[1]/Person/Name')
Her durumda koşulunun uygulandığı yol ifadesindeki düğüme bağlandığını unutmayın. Örneğin, ilk yol ifadesi her /People/Person düğümündeki ilk <Name> öğeyi seçer ve sağlanan XML örneğiyle aşağıdakileri döndürür:
<Name>John</Name><Name>Goofy</Name><Name>Daffy</Name>
Ancak, ikinci yol ifadesi ilk /People/Person düğümü altındaki tüm <Name> öğeleri seçer. Bu nedenle, aşağıdakileri döndürür:
<Name>John</Name>
Ayraçlar, koşulun değerlendirme sırasını değiştirmek için de kullanılabilir. Örneğin, aşağıdaki ifadede (/People/Person/Name) yolunu [1] koşulundan ayırmak için bir parantez kümesi kullanılır:
select @x.query('(/People/Person/Name)[1]')
Bu örnekte, koşulun uygulanma sırası değişir. Bunun nedeni, kapalı yolun önce değerlendirilir (/Kişiler/Kişi/Ad) ve ardından [1] koşulu işlecinin, kapalı yolla eşleşen tüm düğümleri içeren kümeye uygulanmasıdır. Parantezler olmadan, ilk yol ifadesi örneğine benzer şekilde [1] düğüm testi olarak child::Name uygulandığından işlem sırası farklı olabilir.
Niceleyiciler ve Koşul
Niceleyiciler, koşulun ayraçlarının içine birden fazla kez kullanılabilir ve eklenebilir. Örneğin, önceki örneği kullanarak, aşağıdaki karmaşık bir koşul alt ifadesi içinde birden fazla niceleyicinin geçerli bir kullanımıdır.
select @x.query('/People/Person[contains(Name[1], "J") and xs:integer(Age[1]) < 40]/Name/text()')
Koşul ifadesinin sonucu Boole değerine dönüştürülür ve koşul doğruluk değeri olarak adlandırılır. Sonuçta yalnızca koşul doğruluk değerinin True olduğu dizideki düğümler döndürülür. Diğer tüm düğümler atılır.
Örneğin, aşağıdaki yol ifadesi ikinci adımında bir koşul içerir:
/child::root/child::Location[attribute::LocationID=10]
Bu koşul tarafından belirtilen koşul tüm öğe düğümü alt öğelerine <Location> uygulanır. Sonuç, yalnızca LocationID öznitelik değeri 10 olan iş merkezi konumlarının döndürülür.
Önceki yol ifadesi aşağıdaki SELECT deyiminde yürütülür:
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
Bilgi İşlem Koşulu Doğruluk Değerleri
XQuery belirtimlerine göre koşul gerçek değerini belirlemek için aşağıdaki kurallar uygulanır:
Koşul ifadesinin değeri boş bir diziyse, koşul gerçeği değeri False olur.
Örneğin:
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=7Bu sorgudaki yol ifadesi yalnızca LotSize özniteliği belirtilen öğe düğümlerini <
Location> döndürür. Koşul belirli <Location>bir için boş bir dizi döndürürse, sonuçta bu iş merkezi konumu döndürülür.Koşul değerleri yalnızca xs:integer, xs:Boole veya node* olabilir. Düğüm* için koşul, düğüm varsa True ve boş bir dizi için False olarak değerlendirilir. Çift ve kayan tür gibi diğer herhangi bir sayısal tür statik yazma hatası oluşturur. Bir ifadenin koşul gerçeği değeri, yalnızca elde edilen tamsayı bağlam konumunun değerine eşitse True olur. Ayrıca, yalnızca tamsayı değişmez değerleri ve last() işlevi filtrelenmiş adım ifadesinin kardinalitesini 1 olarak azaltır.
Örneğin, aşağıdaki sorgu öğenin üçüncü alt öğe düğümünü <
Features> alır.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=19Önceki sorgudan aşağıdakilere dikkat edin:
İfadedeki üçüncü adım, değeri 3 olan bir koşul ifadesi belirtir. Bu nedenle, bu ifadenin koşul gerçeği değeri yalnızca bağlam konumu 3 olan düğümler için True'dur.
Üçüncü adım ayrıca düğüm testindeki tüm düğümleri gösteren bir joker karakter (*) belirtir. Ancak koşul, düğümleri filtreler ve yalnızca üçüncü konumdaki düğümü döndürür.
Sorgu, belge kökü öğesi alt öğelerinin <
Features> öğe alt öğelerinin <ProductDescription> üçüncü alt öğe düğümünü döndürür.
Koşul ifadesinin değeri Boole türünde basit bir tür değeriyse, koşul gerçeği değeri koşul ifadesinin değerine eşittir.
Örneğin, müşteri anketi XML örneği olan XML örneğini barındıran xml türü değişkeninde aşağıdaki sorgu belirtilir. Sorgu, alt öğeleri olan müşterileri alır. Bu sorguda, bu HasChildren<1>/HasChildren< olacaktır>.
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 @yÖnceki sorgudan aşağıdakilere dikkat edin:
for döngüsündeki ifadenin iki adımı vardır ve ikinci adım bir koşul belirtir. Bu koşulun değeri bir Boole türü değeridir. Bu değer True ise, koşulun doğruluk değeri de True olur.
Sorgu, belge kökünün <
Customer> Survey< öğesi alt öğelerinin >koşul değeri True olan alt öğelerini döndürür. Sonuç şu şekildedir:<CustomerWithChildren CustomerID="1"/>
Koşul ifadesinin değeri en az bir düğüm içeren bir diziyse, koşul gerçeği değeri True olur.
Örneğin, aşağıdaki sorgu, XML kataloğu açıklaması < ön eki ile ilişkilendirilmiş ad alanından öğenin alt öğesi Features> olan en az bir özellik içeren ürün modelleri için ProductModelID değerini alır.
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
Önceki sorgudan aşağıdakilere dikkat edin:
WHERE yan tümcesi exist() yöntemini (XML veri türü) belirtir.
exist() yönteminin içindeki yol ifadesi, ikinci adımda bir koşul belirtir. Koşul ifadesi en az bir özellik dizisi döndürürse, bu koşul ifadesinin doğruluk değeri True olur. Bu durumda, exist() yöntemi true döndürdüğünden ProductModelID döndürülür.
Statik Yazma ve Koşul Filtreleri
Koşul, bir ifadenin statik olarak çıkarım yapılan türünü de etkileyebilir. Tamsayı değişmez değerleri ve last() işlevi, filtrelenmiş adım ifadesinin kardinalitesini en fazla bir değere düşürür.