Aracılığıyla paylaş


Sıralama İçeren XQueries

Şunlar için geçerlidir: SQL Server

İlişkisel veritabanlarında sıra kavramı yoktur. Örneğin, "Veritabanından ilk müşteriyi al" gibi bir istekte bulunamazsınız. Ancak, bir XML belgesini sorgulayabilir ve ilk <Customer> öğesini alabilirsiniz. Ardından her zaman aynı müşteriyi alırsınız.

Bu konu başlığında, düğümlerin belgede göründüğü sırayı temel alan sorgular gösterilmektedir.

Örnekler

A. Bir ürünün ikinci iş merkezi konumunda üretim adımlarını alma

Belirli bir ürün modeli için aşağıdaki sorgu, üretim sürecindeki bir dizi iş merkezi konumundaki ikinci iş merkezi konumundaki üretim adımlarını alır.

SELECT Instructions.query('  
     declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
    <ManuStep ProdModelID = "{sql:column("Production.ProductModel.ProductModelID")}"  
                ProductModelName = "{ sql:column("Production.ProductModel.Name") }" >  
     <Location>  
       { (//AWMI:root/AWMI:Location)[2]/@* }  
       <Steps>  
         { for $s in (//AWMI:root/AWMI:Location)[2]//AWMI:step  
           return  
              <Step>  
               { string($s) }  
              </Step>  
         }  
        </Steps>  
      </Location>  
     </ManuStep>  
') as Result  
FROM Production.ProductModel  
WHERE ProductModelID=7  

Önceki sorgudan aşağıdakilere dikkat edin:

  • Küme ayraçlarındaki ifadeler, değerlendirmesinin sonucuyla değiştirilir. Daha fazla bilgi için bkz. XML Oluşturma (XQuery).

  • @* ikinci iş merkezi konumunun tüm özniteliklerini alır.

  • FLWOR yinelemesi (FOR ... RETURN) ikinci iş merkezi konumunun <step> tüm alt öğelerini alır.

  • sql:column() işlevi (XQuery), oluşturulan XML'deki ilişkisel değeri içerir.

Sonuç şu şekildedir:

<ManuStep ProdModelID="7" ProductModelName="HL Touring Frame">  
  <Location LocationID="20" SetupHours="0.15"   
              MachineHours="2"  LaborHours="1.75" LotSize="1">  
  <Steps>  
   <Step>Assemble all frame components following blueprint 1299.</Step>  
     ...  
  </Steps>  
 </Location>  
</ManuStep>    

Önceki sorgu yalnızca metin düğümlerini alır. Bunun yerine tüm <step> öğenin döndürülmesini istiyorsanız string () işlevini sorgudan kaldırın:

B. Bir ürünün üretiminde ikinci iş merkezi konumunda kullanılan tüm malzeme ve araçları bulun

Belirli bir ürün modeli için aşağıdaki sorgu, üretim sürecindeki iş merkezi konumları sırasına göre ikinci iş merkezi konumunda kullanılan araçları ve malzemeleri alır.

SELECT Instructions.query('  
    declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
   <Location>  
      { (//AWMI:root/AWMI:Location)[1]/@* }  
       <Tools>  
         { for $s in (//AWMI:root/AWMI:Location)[1]//AWMI:step//AWMI:tool  
           return  
              <Tool>  
                { string($s) }  
              </Tool>  
          }  
        </Tools>  
        <Materials>  
            { for $s in (//AWMI:root/AWMI:Location)[1]//AWMI:step//AWMI:material  
              return  
                 <Material>  
                    { string($s) }  
                 </Material>  
             }  
         </Materials>  
  </Location>  
') as Result  
FROM Production.ProductModel  
where ProductModelID=7  

Önceki sorgudan aşağıdakilere dikkat edin:

  • Sorgu, öğesini oluşturur <Location> ve öznitelik değerlerini veritabanından alır.

  • İki FLWOR kullanır (... dönüş) yinelemeleri: biri araçları almak için, diğeri de kullanılan malzemeyi almak için.

Sonuç şu şekildedir:

<Location LocationID="10" SetupHours=".5"   
          MachineHours="3" LaborHours="2.5" LotSize="100">  
  <Tools>  
    <Tool>T-85A framing tool</Tool>  
    <Tool>Trim Jig TJ-26</Tool>  
    <Tool>router with a carbide tip 15</Tool>  
    <Tool>Forming Tool FT-15</Tool>  
  </Tools>  
  <Materials>  
    <Material>aluminum sheet MS-2341</Material>  
  </Materials>  
</Location>  

C. Ürün kataloğundan ilk iki ürün özelliği açıklamasını alma

Belirli bir ürün modeli için sorgu, ürün modeli kataloğundaki öğesinden <Features> ilk iki özellik açıklamasını alır.

SELECT CatalogDescription.query('  
     declare namespace p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
     <ProductModel ProductModelID= "{ data( (/p1:ProductDescription/@ProductModelID)[1] ) }"  
                   ProductModelName = "{ data( (/p1:ProductDescription/@ProductModelName)[1] ) }" >  
       {  
         for $F in /p1:ProductDescription/p1:Features  
         return   
           $F/*[position() <= 2]   
       }  
     </ProductModel>  
      ') as x  
FROM Production.ProductModel  
where ProductModelID=19  

Önceki sorgudan aşağıdakilere dikkat edin:

Sorgu gövdesi, ProductModelID ve ProductModelName özniteliklerine sahip öğeyi içeren <ProductModel> XML'yi oluşturur.

  • Sorgu for ... Ürün modeli özellik açıklamalarını almak için RETURN döngüsü. position() işlevi ilk iki özelliği almak için kullanılır.

Sonuç şu şekildedir:

<ProductModel ProductModelID="19" ProductModelName="Mountain 100">  
 <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>  
 <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>  
</ProductModel>   

D. Ürünün üretim sürecinde ilk iş merkezi konumunda kullanılan ilk iki aracı bulma

Bir ürün modeli için bu sorgu, üretim sürecindeki iş merkezi konumları dizisindeki ilk iş merkezi konumunda kullanılan ilk iki aracı döndürür. Sorgu, Production.ProductModel tablosunun Instructions sütununda depolanan üretim yönergelerine göre belirtilir.

SELECT Instructions.query('  
     declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
   for $Inst in (//AWMI:root/AWMI:Location)[1]  
   return   
     <Location>  
       { $Inst/@* }  
       <Tools>  
         { for $s in ($Inst//AWMI:step//AWMI:tool)[position() <= 2]  
           return  
             <Tool>  
               { string($s) }  
             </Tool>  
         }  
       </Tools>  
     </Location>  
') as Result  
FROM Production.ProductModel  
where ProductModelID=7  

Sonuç şu şekildedir:

<Location LocationID="10" SetupHours=".5"   
            MachineHours="3" LaborHours="2.5" LotSize="100">  
  <Tools>  
    <Tool>T-85A framing tool</Tool>  
    <Tool>Trim Jig TJ-26</Tool>  
  </Tools>  
</Location>   

E. Belirli bir ürünün üretimindeki ilk iş merkezi konumunda son iki üretim adımını bulma

Sorgu, son iki üretim adımını almak için last() işlevini kullanır.

SELECT Instructions.query('   
declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
  <LastTwoManuSteps>  
   <Last-1Step>   
     { (/AWMI:root/AWMI:Location)[1]/AWMI:step[(last()-1)]/text() }  
   </Last-1Step>  
   <LastStep>   
     { (/AWMI:root/AWMI:Location)[1]/AWMI:step[last()]/text() }  
   </LastStep>  
  </LastTwoManuSteps>') as Result  
FROM Production.ProductModel  
where ProductModelID=7  

Sonuç şu şekildedir:

<LastTwoManuSteps>  
   <Last-1Step>When finished, inspect the forms for defects per   
               Inspection Specification .</Last-1Step>  
   <LastStep>Remove the frames from the tool and place them in the   
             Completed or Rejected bin as appropriate.</LastStep>  
</LastTwoManuSteps>  

Ayrıca Bkz.

XML Verileri (SQL Server)
XQuery Dil Referansı (SQL Server)
XML Yapısı (XQuery)