Aracılığıyla paylaş


Genel XQuery kullanım örnekleri

Şunlar için geçerlidir: SQL Server

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:

  • namespace XQuery 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.

  • WHERE yan tümcesinde exist() 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:

  • WHERE yan tümcesinde exist() yöntemi yalnızca öğesiyle <Picture> ürün kataloğu açıklamalarına sahip satırları almak için kullanılır.

  • WHERE yan 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 FOR döngü, ürün adı ve tek tek özelliğin döndürüldiği bir Kartezyen ürünü oluşturur.

  • ProductName bir ö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 ... RETURN dö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:

  • WHERE yan 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 ile contains() 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ümcesindeki WHERE yö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.