Bagikan melalui


XQueries Melibatkan Hierarki

Berlaku untuk:SQL Server

Sebagian besar kolom jenis xml dalam database AdventureWorks adalah dokumen semi-terstruktur. Oleh karena itu, dokumen yang disimpan di setiap baris mungkin terlihat berbeda. Sampel kueri dalam topik ini menggambarkan cara mengekstrak informasi dari berbagai dokumen ini.

Contoh

J. Dari dokumen instruksi manufaktur, ambil lokasi pusat kerja bersama dengan langkah manufaktur pertama di lokasi tersebut

Untuk model produk 7, kueri membuat XML yang menyertakan <>ManuInstrelemen , dengan atribut ProductModelID dan ProductModelName, dan satu atau beberapa <Location> elemen turunan.

Setiap <Location> elemen memiliki sekumpulan atribut sendiri dan satu <step> elemen anak. Elemen anak ini <step> adalah langkah manufaktur pertama di lokasi pusat kerja.

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

Perhatikan hal berikut ini dari kueri sebelumnya:

  • Kata kunci namespace layanan di XQuery Prolog mendefinisikan awalan namespace. Awalan ini digunakan nanti dalam isi kueri.

  • Konteks beralih token, {) dan (}, digunakan untuk mengalihkan kueri dari konstruksi XML ke evaluasi kueri.

  • sql:column() digunakan untuk menyertakan nilai relasional dalam XML yang sedang dibangun.

  • Dalam membangun <Location> elemen, $wc/@* mengambil semua atribut lokasi pusat kerja.

  • Fungsi string() mengembalikan nilai string dari <step> elemen .

Ini adalah hasil parsial:

<ManuInstr ProdModelID="7" ProductModelName="HL Touring Frame">  
   <Location LocationID="10" SetupHours="0.5"   
            MachineHours="3" LaborHours="2.5" LotSize="100">  
     <step1>Insert aluminum sheet MS-2341 into the T-85A   
             framing tool.</step1>  
   </Location>  
   <Location LocationID="20" SetupHours="0.15"   
            MachineHours="2" LaborHours="1.75" LotSize="1">  
      <step1>Assemble all frame components following   
             blueprint 1299.</step1>  
   </Location>  
...  
</ManuInstr>   

B. Temukan semua nomor telepon di kolom AdditionalContactInfo

Kueri berikut mengambil nomor telepon tambahan untuk kontak pelanggan tertentu dengan mencari seluruh hierarki untuk elemen tersebut <telephoneNumber> . <telephoneNumber> Karena elemen dapat muncul di mana saja dalam hierarki, kueri menggunakan operator turunan dan mandiri (//) dalam pencarian.

SELECT AdditionalContactInfo.query('  
 declare namespace ci="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo";  
 declare namespace act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";  
for $ph in /ci:AdditionalContactInfo//act:telephoneNumber  
   return  
      $ph/act:number  
') as x  
FROM  Person.Contact  
WHERE ContactID = 1  

Ini adalah hasilnya:

\<act:number   
  xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">  
  111-111-1111  
\</act:number>  
\<act:number   
  xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">  
  112-111-1111  
\</act:number>  

Untuk hanya mengambil nomor telepon tingkat atas, khususnya <telephoneNumber> elemen anak dari <AdditionalContactInfo>, ekspresi FOR dalam kueri berubah menjadi

for $ph in /ci:AdditionalContactInfo/act:telephoneNumber.

Baca juga

Dasar-Dasar XQuery
Konstruksi XML (XQuery)
XML Data (SQL Server)