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.
Bu makalede XQuery kullanımına genel örnekler verilmektedir.
Örnekler
A. Ürünleri ve ağırlıkları bulmak için katalog açıklamalarını sorgulama
Aşağıdaki sorgu, ürün kataloğu açıklamasından ürün modeli kimliklerini ve ağırlıklarını (varsa) döndürür. Sorgu, aşağıdaki forma sahip XML oluşturur:
<Product ProductModelID="...">
<Weight>...</Weight>
</Product>
Sorgu şu şekildedir:
SELECT CatalogDescription.query('
declare namespace p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
<Product ProductModelID="{ (/p1:ProductDescription/@ProductModelID)[1] }">
{
/p1:ProductDescription/p1:Specifications/Weight
}
</Product>
') AS Result
FROM Production.ProductModel
WHERE CatalogDescription IS NOT NULL;
Önceki sorguda dikkate alınacak noktalara dikkat edin:
namespaceXQuery günlüğündeki anahtar sözcük, sorgu gövdesinde kullanılan bir ad alanı ön eki tanımlar.Sorgu gövdesi gerekli XML'yi oluşturur.
WHEREyan tümcesindeexist()yöntemi yalnızca ürün kataloğu açıklamalarını içeren satırları bulmak için kullanılır. Diğer bir ifadeyle, öğesini içeren<ProductDescription>XML.
Sonuç şu şekildedir:
<Product ProductModelID="19"/>
<Product ProductModelID="23"/>
<Product ProductModelID="25"/>
<Product ProductModelID="28"><Weight>Varies with size.</Weight></Product>
<Product ProductModelID="34"/>
<Product ProductModelID="35"/>
Aşağıdaki sorgu aynı bilgileri alır, ancak yalnızca katalog açıklaması belirtimlerdeki <Specifications> ağırlık, <Weight> öğe olan öğeyi içeren ürün modelleri için kullanılır. Bu örnekte ön ekini pd ve ad alanı bağlamasını bildirmek için kullanılırWITH XMLNAMESPACES. Bu şekilde bağlama hem yönteminde hem de query() yönteminde exist() açıklanmış olmaz.
WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS pd)
SELECT CatalogDescription.query('
<Product ProductModelID="{ (/pd:ProductDescription/@ProductModelID)[1] }">
{
/pd:ProductDescription/pd:Specifications/Weight
}
</Product>
') AS x
FROM Production.ProductModel
WHERE CatalogDescription.exist('/pd:ProductDescription/pd:Specifications//Weight ') = 1;
Önceki sorguda, exist() yan tümcesindeki xml veri türünün yöntemi öğesinde WHERE<Specifications> bir <Weight> öğe olup olmadığını denetler.
B. Katalog açıklamalarında ön açı ve küçük boyutlu resimler bulunan ürün modelleri için ürün modeli kimliklerini bulma
XML ürün kataloğu açıklaması, ürün resimlerini ve <Picture> öğesini içerir. Her resmin resim açısı (öğe) ve boyutu ( <Angle><Size> öğe) gibi çeşitli özellikleri vardır.
Katalog açıklamaları ön açı ve küçük boyutlu resimler içeren ürün modelleri için sorgu, aşağıdaki forma sahip XML oluşturur:
< Product ProductModelID="...">
<Picture>
<Angle>front</Angle>
<Size>small</Size>
</Picture>
</Product>
WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS pd)
SELECT CatalogDescription.query('
<pd:Product ProductModelID="{ (/pd:ProductDescription/@ProductModelID)[1] }">
<Picture>
{ /pd:ProductDescription/pd:Picture/pd:Angle }
{ /pd:ProductDescription/pd:Picture/pd:Size }
</Picture>
</pd:Product>
') as Result
FROM Production.ProductModel
WHERE CatalogDescription.exist('/pd:ProductDescription/pd:Picture') = 1
AND CatalogDescription.value('(/pd:ProductDescription/pd:Picture/pd:Angle)[1]', 'varchar(20)') = 'front'
AND CatalogDescription.value('(/pd:ProductDescription/pd:Picture/pd:Size)[1]', 'varchar(20)') = 'small'
Önceki sorguda dikkate alınacak noktalara dikkat edin:
WHEREyan tümcesindeexist()yöntemi yalnızca öğesiyle<Picture>ürün kataloğu açıklamalarına sahip satırları almak için kullanılır.WHEREyan tümcesi, ve<Angle>öğelerinin değerlerini<Size>karşılaştırmak için yöntemini iki kez kullanırvalue().
Kısmi bir sonuç aşağıdadır:
<p1:Product
xmlns:p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription"
ProductModelID="19">
<Picture>
<p1:Angle>front</p1:Angle>
<p1:Size>small</p1:Size>
</Picture>
</p1:Product>
...
C. Ürün modeli adı ve özellik çiftlerinin düz bir listesini oluşturun; her çift Özellikler> öğesinde <kapalıdır
Ürün modeli kataloğu açıklamasında, XML çeşitli ürün özellikleri içerir. Tüm bu özellikler öğesinde <Features> yer alır. Sorgu, gerekli XML'yi oluşturmak için XML yapısını (XQuery) kullanır. Küme ayraçlarındaki ifade sonuçla değiştirilir.
SELECT CatalogDescription.query('
declare namespace p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
for $pd in /p1:ProductDescription,
$f in $pd/p1:Features/*
return
<Feature>
<ProductModelName> { data($pd/@ProductModelName) } </ProductModelName>
{ $f }
</Feature>
') AS x
FROM Production.ProductModel
WHERE ProductModelID = 19;
Önceki sorguda dikkate alınacak noktalara dikkat edin:
$pd/p1:Features/*yalnızca öğesinin öğe düğümü alt öğelerini<Features>döndürür, ancak$pd/p1:Features/node()tüm düğümleri döndürür. Buna öğe düğümleri, metin düğümleri, işleme yönergeleri ve açıklamalar dahildir.İki
FORdöngü, ürün adı ve tek tek özelliğin döndürüldiği bir Kartezyen ürünü oluşturur.ProductNamebir özniteliktir. Bu sorgudaki XML yapısı bunu bir öğe olarak döndürür.
Kısmi bir sonuç aşağıdadır:
<Feature>
<ProductModelName>Mountain 100</ProductModelName>
<ProductModelID>19</ProductModelID>
<p1:Warranty
xmlns:p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">
<p1:WarrantyPeriod>3 year</p1:WarrantyPeriod>
<p1:Description>parts and labor</p1:Description>
</p1:Warranty>
</Feature>
<Feature>
<ProductModelName>Mountain 100</ProductModelName>
<ProductModelID>19</ProductModelID>
<p2:Maintenance xmlns:p2="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">
<p2:NoOfYears>10</p2:NoOfYears>
<p2:Description>maintenance contact available through your dealer
or any AdventureWorks retail store.</p2:Description>
</p2:Maintenance>
</Feature>
...
...
D. Ürün modelinin katalog açıklamasından ürün modeli adını, model kimliğini ve Product <> öğesi içinde gruplandırılmış özellikleri listeleyin
Aşağıdaki sorgu, ürün modelinin katalog açıklamasında depolanan bilgileri kullanarak bir öğenin içinde <Product> gruplandırılmış ürün modeli adını, model kimliğini ve özellikleri listeler.
SELECT ProductModelID,
CatalogDescription.query('
declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
<Product>
<ProductModelName>
{ data(/pd:ProductDescription/@ProductModelName) }
</ProductModelName>
<ProductModelID>
{ data(/pd:ProductDescription/@ProductModelID) }
</ProductModelID>
{ /pd:ProductDescription/pd:Features/* }
</Product>
') AS x
FROM Production.ProductModel
WHERE ProductModelID = 19;
Kısmi bir sonuç aşağıdadır:
<Product>
<ProductModelName>Mountain 100</ProductModelName>
<ProductModelID>19</ProductModelID>
<p1:Warranty>... </p1:Warranty>
<p2:Maintenance>... </p2:Maintenance>
<p3:wheel xmlns:p3="https://www.adventure-works.com/schemas/OtherFeatures">High performance wheels.</p3:wheel>
<p4:saddle xmlns:p4="https://www.adventure-works.com/schemas/OtherFeatures">
<p5:i xmlns:p5="http://www.w3.org/1999/xhtml">Anatomic design</p5:i> and made from durable leather for a full-day of riding in comfort.</p4:saddle>
<p6:pedal xmlns:p6="https://www.adventure-works.com/schemas/OtherFeatures">
<p7:b xmlns:p7="http://www.w3.org/1999/xhtml">Top-of-the-line</p7:b> clipless pedals with adjustable tension.</p6:pedal>
...
E. Ürün modeli özellik açıklamalarını alma
Aşağıdaki sorgu, , ProductModelName öznitelikleri ve ilk iki ürün özelliğine sahip ProductModelIDbir <Product> öğe içeren XML'yi oluşturur. Özellikle, ilk iki ürün özelliği öğenin ilk iki alt öğesidir <Features> . Daha fazla özellik varsa boş <There-is-more/> bir öğe döndürür.
SELECT CatalogDescription.query('
declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
<Product>
{ /pd:ProductDescription/@ProductModelID }
{ /pd:ProductDescription/@ProductModelName }
{
for $f in /pd:ProductDescription/pd:Features/*[position()<=2]
return
$f
}
{
if (count(/pd:ProductDescription/pd:Features/*) > 2)
then <there-is-more/>
else ()
}
</Product>
') AS Result
FROM Production.ProductModel
WHERE CatalogDescription IS NOT NULL;
Önceki sorguda dikkate alınacak noktalara dikkat edin:
-
FOR...RETURNdöngü yapısı ilk iki ürün özelliğini alır.position()işlevi, öğelerin dizideki konumunu bulmak için kullanılır.
F. Ürün kataloğu açıklamasında ile biten öğe adlarını bulma ons
Aşağıdaki sorgu katalog açıklamalarında arama yapar ve öğesinde <ProductDescription> adı ile onsbiten tüm öğeleri döndürür.
SELECT ProductModelID,
CatalogDescription.query('
declare namespace p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
for $pd in /p1:ProductDescription/*[substring(local-name(.),string-length(local-name(.))-2,3)="ons"]
return
<Root>
{ $pd }
</Root>
') AS Result
FROM Production.ProductModel
WHERE CatalogDescription IS NOT NULL;
Kısmi bir sonuç aşağıdadır:
ProductModelID Result
-----------------------------------------
19 <Root>
<p1:Specifications xmlns:p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">
...
</p1:Specifications>
</Root>
G. "Aerodinamik" sözcüğünü içeren özet açıklamaları bulma
Aşağıdaki sorgu, katalog açıklamalarında özet açıklamasında "Aerodinamik" sözcüğü bulunan ürün modellerini alır:
WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS pd)
SELECT ProductModelID,
CatalogDescription.query('
<Prod >
{ /pd:ProductDescription/@ProductModelID }
{ /pd:ProductDescription/pd:Summary }
</Prod>
') AS Result
FROM Production.ProductModel
WHERE CatalogDescription.value('
contains( string( (/pd:ProductDescription/pd:Summary)[1] ),"Aerodynamic")', 'bit') = 1;
Sorgu, SELECTxml veri türünün ve value() yöntemlerini belirtirquery(). Bu nedenle, ad alanları bildirimini iki farklı sorgu girişinde iki kez yinelemek yerine, ön ek pd sorguda kullanılır ve kullanılarak WITH XMLNAMESPACESyalnızca bir kez tanımlanır.
Önceki sorguda dikkate alınacak noktalara dikkat edin:
WHEREyan tümcesi yalnızca katalog açıklamasının öğesinde "Aerodinamik"<Summary>sözcüğünü içerdiği satırları almak için kullanılır.contains()işlevi, sözcüğün metne eklenip eklenmediğini görmek için kullanılır.value()xml veri türünün yöntemi tarafından döndürülen değeri 1 ilecontains()karşılaştırır.
Sonuç şu şekildedir:
ProductModelID Result
-------------- ------------------------------------------
28 <Prod ProductModelID="28">
<pd:Summary xmlns:pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">
<p1:p xmlns:p1="http://www.w3.org/1999/xhtml">
A TRUE multi-sport bike that offers streamlined riding and a
revolutionary design. Aerodynamic design lets you ride with the
pros, and the gearing will conquer hilly roads.</p1:p>
</pd:Summary>
</Prod>
H. Katalog açıklamalarında ürün modeli resimleri olmayan ürün modellerini bulma
Aşağıdaki sorgu, katalog açıklamalarında öğe <Picture> içermeyen ürün modelleri için ProductModelID'leri alır.
SELECT ProductModelID
FROM Production.ProductModel
WHERE CatalogDescription IS NOT NULL
AND CatalogDescription.exist('declare namespace p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
/p1:ProductDescription/p1:Picture
') = 0;
Önceki sorguda dikkate alınacak noktalara dikkat edin:
exist()Yan tümcesindekiWHEREyöntem False (0) döndürürse, ürün modeli kimliği döndürülür. Aksi takdirde, döndürülemez.Tüm ürün açıklamaları bir
<Picture>öğe içerdiğinden, bu durumda sonuç kümesi boş olur.