Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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
namespacekunci dalam prolog XQuery menentukan awalan namespace yang digunakan dalam isi kueri.Isi kueri membuat XML yang diperlukan.
WHEREDalam 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:
WHEREDalam 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
FORperulangan menghasilkan produk Kartesius tempat nama produk dan fitur individu dikembalikan.ProductNameadalah 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
FORperulangan ...RETURNmengambil dua fitur produk pertama. Fungsiposition()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
WHEREini 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 dengancontains()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 dalamWHEREklausul 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.