Bagikan melalui


XQueries Melibatkan Urutan

Berlaku untuk:SQL Server

Database relasional tidak memiliki konsep urutan. Misalnya, Anda tidak dapat membuat permintaan seperti "Dapatkan pelanggan pertama dari database." Namun, Anda dapat mengkueri dokumen XML dan mengambil elemen Pelanggan> pertama<. Kemudian, Anda akan selalu mengambil pelanggan yang sama.

Topik ini mengilustrasikan kueri berdasarkan urutan di mana simpul muncul dalam dokumen.

Contoh

J. Mengambil langkah-langkah manufaktur di lokasi pusat kerja kedua untuk produk

Untuk model produk tertentu, kueri berikut mengambil langkah-langkah manufaktur di lokasi pusat kerja kedua dalam urutan lokasi pusat kerja dalam proses manufaktur.

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  

Perhatikan hal berikut ini dari kueri sebelumnya:

  • Ekspresi dalam kurung kurawal digantikan oleh hasil evaluasinya. Untuk informasi selengkapnya, lihat Konstruksi XML (XQuery).

  • @* mengambil semua atribut lokasi pusat kerja kedua.

  • Iterasi FLWOR (UNTUK ... RETURN) mengambil semua <step> elemen turunan dari lokasi pusat kerja kedua.

  • Fungsi sql:column() (XQuery) menyertakan nilai relasional dalam XML yang sedang dibangun.

Ini adalah hasilnya:

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

Kueri sebelumnya hanya mengambil simpul teks. Jika Anda ingin seluruh <step> elemen dikembalikan sebagai gantinya , hapus fungsi string() dari kueri:

B. Temukan semua bahan dan alat yang digunakan di lokasi pusat kerja kedua dalam pembuatan produk

Untuk model produk tertentu, kueri berikut mengambil alat dan bahan yang digunakan di lokasi pusat kerja kedua dalam urutan lokasi pusat kerja dalam proses manufaktur.

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  

Perhatikan hal berikut ini dari kueri sebelumnya:

  • Kueri membuat <elemen Location> dan mengambil nilai atributnya dari database.

  • Ini menggunakan dua FLWOR (untuk ... return) iterasi: satu untuk mengambil alat dan satu untuk mengambil materi yang digunakan.

Ini adalah hasilnya:

<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. Mengambil dua deskripsi fitur produk pertama dari katalog produk

Untuk model produk tertentu, kueri mengambil dua deskripsi fitur pertama dari <Features> elemen dalam katalog model produk.

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  

Perhatikan hal berikut ini dari kueri sebelumnya:

Badan kueri membuat XML yang menyertakan <ProductModel> elemen yang memiliki atribut ProductModelID dan ProductModelName.

  • Kueri menggunakan FOR ... RETURN loop untuk mengambil deskripsi fitur model produk. Fungsi position() digunakan untuk mengambil dua fitur pertama.

Ini adalah hasilnya:

<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. Temukan dua alat pertama yang digunakan di lokasi pusat kerja pertama dalam proses manufaktur produk

Untuk model produk, kueri ini mengembalikan dua alat pertama yang digunakan di lokasi pusat kerja pertama dalam urutan lokasi pusat kerja dalam proses manufaktur. Kueri ditentukan terhadap instruksi manufaktur yang disimpan di kolom Instruksi tabel Production.ProductModel .

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  

Ini adalah hasilnya:

<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. Temukan dua langkah manufaktur terakhir di lokasi pusat kerja pertama dalam pembuatan produk tertentu

Kueri menggunakan fungsi last() untuk mengambil dua langkah manufaktur terakhir.

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  

Ini adalah hasilnya:

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

Lihat Juga

XML Data (SQL Server)
Referensi Bahasa XQuery (SQL Server)
Konstruksi XML (XQuery)