Bagikan melalui


Kasus penggunaan XQuery umum

Berlaku untuk:SQL Server

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

Berikut kuerinya:

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 pertimbangan berikut dari kueri sebelumnya:

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

  • Isi kueri membuat XML yang diperlukan.

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

Berikut 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 query() metode dan dalam exist() metode .

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;

Dalam kueri sebelumnya, exist() metode tipe data xml dalam WHERE klausa memeriksa untuk melihat apakah ada <Weight> 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, 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 pertimbangan berikut dari kueri sebelumnya:

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

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

Berikut 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 pertimbangan berikut 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.

  • Kedua FOR perulangan menghasilkan produk Kartesius tempat nama produk dan fitur individu dikembalikan.

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

Berikut 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 <Product> dikelompokkan di dalam elemen.

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;

Berikut 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 ProductModelID, ProductModelName atribut, 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 pertimbangan berikut dari kueri sebelumnya:

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

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

Kueri berikut mencari deskripsi katalog dan mengembalikan semua elemen dalam <ProductDescription> elemen yang namanya berakhiran 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;

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

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

Perhatikan pertimbangan berikut dari kueri sebelumnya:

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

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

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

Berikut 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 pertimbangan berikut dari kueri sebelumnya:

  • exist() Jika metode dalam WHERE klausul 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.