Bagikan melalui


Kasus Penggunaan XQuery Umum

Berlaku untuk:SQL Server

Topik ini menyediakan contoh umum penggunaan XQuery.

Contoh

J. Deskripsi katalog kueri untuk menemukan produk dan bobot

Kueri berikut mengembalikan ID dan bobot model produk, jika ada, dari deskripsi katalog produk. Kueri membuat XML yang memiliki formulir berikut:

<Product ProductModelID="...">  
  <Weight>...</Weight>  
</Product>  

Ini adalah kueri:

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  

Perhatikan hal berikut ini dari kueri sebelumnya:

  • Kata kunci namespace dalam prolog XQuery menentukan awalan namespace yang digunakan dalam isi kueri.

  • Isi kueri membuat XML yang diperlukan.

  • Dalam klausa WHERE, metode exist() digunakan untuk hanya menemukan baris yang berisi deskripsi katalog produk. Artinya, XML yang berisi <ProductDescription> elemen .

Ini adalah hasilnya:

<Product ProductModelID="19"/>  
<Product ProductModelID="23"/>   
<Product ProductModelID="25"/>   
<Product ProductModelID="28"><Weight>Varies with size.</Weight></Product>  
<Product ProductModelID="34"/>  
<Product ProductModelID="35"/>  

Kueri berikut mengambil informasi yang sama, tetapi hanya untuk model produk yang deskripsi katalognya mencakup berat, <Weight> elemen, dalam spesifikasi, <Specifications> elemen . Contoh ini menggunakan WITH XMLNAMESPACES untuk mendeklarasikan awalan pd dan pengikatan namespace layanannya. Dengan cara ini, pengikatan tidak dijelaskan dalam metode query() dan dalam metode exist().

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  

Di kueri sebelumnya, metode exist() dari tipe data xml dalam klausa WHERE memeriksa untuk melihat apakah adaWeight<> elemen dalam <Specifications> elemen .

B. Menemukan ID model produk untuk model produk yang deskripsi katalognya mencakup sudut depan dan gambar ukuran kecil

Deskripsi katalog produk XML mencakup gambar produk, <Picture> elemen . Setiap gambar memiliki beberapa properti. Ini termasuk sudut gambar, <Angle> elemen, dan ukuran, <Size> elemen .

Untuk model produk yang deskripsi katalognya mencakup gambar sudut depan dan ukuran kecil, kueri membuat XML yang memiliki formulir berikut:

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

Perhatikan hal berikut ini dari kueri sebelumnya:

  • Dalam klausa WHERE, metode exist() digunakan untuk mengambil hanya baris yang memiliki deskripsi katalog produk dengan <Picture> elemen .

  • Klausa WHERE menggunakan metode value() dua kali untuk membandingkan nilai>Size< elemen dan .<Angle>

Ini adalah hasil parsial:

<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. Buat daftar datar nama model produk dan pasangan fitur, dengan setiap pasangan diapit dalam <elemen Fitur>

Dalam deskripsi katalog model produk, XML menyertakan beberapa fitur produk. Semua fitur ini disertakan <Features> dalam elemen . Kueri menggunakan Konstruksi XML (XQuery) untuk membuat XML yang diperlukan. Ekspresi dalam kurung kurawal digantikan oleh hasilnya.

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  

Perhatikan hal berikut ini dari kueri sebelumnya:

  • $pd/p1:Features/* hanya mengembalikan turunan <Features>simpul elemen dari , tetapi $pd/p1:Features/node() mengembalikan semua simpul. Ini termasuk node elemen, node teks, instruksi pemrosesan, dan komentar.

  • Dua perulangan FOR menghasilkan produk Kartesius tempat nama produk dan fitur individual dikembalikan.

  • ProductName adalah atribut. Konstruksi XML dalam kueri ini mengembalikannya sebagai elemen.

Ini adalah hasil parsial:

<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. Dari deskripsi katalog model produk, cantumkan nama model produk, ID model, dan fitur yang <dikelompokkan di dalam elemen Produk>

Menggunakan informasi yang disimpan dalam deskripsi katalog model produk, kueri berikut mencantumkan nama model produk, ID model, dan fitur yang <dikelompokkan di dalam elemen Produk> .

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  

Ini adalah hasil parsial:

<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. Mengambil deskripsi fitur model produk

Kueri berikut membuat XML yang menyertakan <Product> elemen yang memiliki atribut ProducModelID, ProductModelName , dan dua fitur produk pertama. Secara khusus, dua fitur produk pertama adalah dua elemen anak pertama dari elemen .<Features> Jika ada lebih banyak fitur, elemen kosong <There-is-more/> akan ditampilkan.

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  

Perhatikan hal berikut ini dari kueri sebelumnya:

  • UNTUK ... Struktur perulangan RETURN mengambil dua fitur produk pertama. Fungsi position() digunakan untuk menemukan posisi elemen dalam urutan.

F. Temukan nama elemen dari deskripsi katalog produk yang diakhir dengan "ons"

Kueri berikut mencari deskripsi katalog dan mengembalikan semua elemen dalam <ProductDescription> elemen yang namanya diakhapi dengan "ons".

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  

Ini adalah hasil parsial:

ProductModelID   Result  
-----------------------------------------  
         19        <Root>         
                     <p1:Specifications xmlns:p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">          
                          ...         
                     </p1:Specifications>         
                   </Root>          

G. Temukan deskripsi ringkasan yang berisi kata "Aerodynamic"

Kueri berikut mengambil model produk yang deskripsi katalognya berisi kata "Aerodinamis" dalam deskripsi ringkasan:

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  

Perhatikan bahwa kueri SELECT menentukan metode query() dan value() dari jenis data xml . Oleh karena itu, alih-alih mengulangi deklarasi namespace dua kali dalam dua prolog kueri perbedaan, pd awalan digunakan dalam kueri dan ditentukan hanya sekali dengan menggunakan XMLNAMESPACES.

Perhatikan hal berikut ini dari kueri sebelumnya:

  • Klausa WHERE digunakan untuk hanya mengambil baris di mana deskripsi katalog berisi kata "Aerodynamic" dalam <Summary> elemen .

  • Fungsi contains() digunakan untuk melihat apakah kata disertakan dalam teks.

  • Metode value() dari jenis data xml membandingkan nilai yang dikembalikan oleh contains() dengan 1.

Ini adalah hasilnya:

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. Menemukan model produk yang deskripsi katalognya tidak menyertakan gambar model produk

Kueri berikut mengambil ProductModelIDs untuk model produk yang deskripsi katalognya tidak menyertakan <Picture> elemen.

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  

Perhatikan hal berikut ini dari kueri sebelumnya:

  • Jika metode exist() dalam klausul WHERE mengembalikan False (0), ID model produk dikembalikan. Jika tidak, itu tidak dikembalikan.

  • Karena semua deskripsi produk menyertakan <Picture> elemen, kumpulan hasil kosong dalam kasus ini.

Lihat Juga

XQueries Melibatkan Hierarki
Kueri X yang Melibatkan Pesanan
XQueries Menangani data relasional
Pencarian String di XQuery
Menangani Namespace di XQuery
Menambahkan Namespace ke Kueri dengan XMLNAMESPACES
XML Data (SQL Server)
Referensi Bahasa XQuery (SQL Server)