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 <>ManuInstr
elemen , 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)