XQueries Melibatkan Urutan
Berlaku untuk:SQL Server
Database relasional tidak memiliki konsep urutan. Misalnya, Anda tidak dapat membuat permintaan seperti "Dapatkan pelanggan pertama dari database." Namun, Anda dapat mengkueri dokumen XML dan mengambil elemen Pelanggan> pertama<. Kemudian, Anda akan selalu mengambil pelanggan yang sama.
Topik ini mengilustrasikan kueri berdasarkan urutan di mana simpul muncul dalam dokumen.
Contoh
J. Mengambil langkah-langkah manufaktur di lokasi pusat kerja kedua untuk produk
Untuk model produk tertentu, kueri berikut mengambil langkah-langkah manufaktur di lokasi pusat kerja kedua dalam urutan lokasi pusat kerja dalam proses manufaktur.
SELECT Instructions.query('
declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
<ManuStep ProdModelID = "{sql:column("Production.ProductModel.ProductModelID")}"
ProductModelName = "{ sql:column("Production.ProductModel.Name") }" >
<Location>
{ (//AWMI:root/AWMI:Location)[2]/@* }
<Steps>
{ for $s in (//AWMI:root/AWMI:Location)[2]//AWMI:step
return
<Step>
{ string($s) }
</Step>
}
</Steps>
</Location>
</ManuStep>
') as Result
FROM Production.ProductModel
WHERE ProductModelID=7
Perhatikan hal berikut ini dari kueri sebelumnya:
Ekspresi dalam kurung kurawal digantikan oleh hasil evaluasinya. Untuk informasi selengkapnya, lihat Konstruksi XML (XQuery).
@* mengambil semua atribut lokasi pusat kerja kedua.
Iterasi FLWOR (UNTUK ... RETURN) mengambil semua <
step
> elemen turunan dari lokasi pusat kerja kedua.Fungsi sql:column() (XQuery) menyertakan nilai relasional dalam XML yang sedang dibangun.
Ini adalah hasilnya:
<ManuStep ProdModelID="7" ProductModelName="HL Touring Frame">
<Location LocationID="20" SetupHours="0.15"
MachineHours="2" LaborHours="1.75" LotSize="1">
<Steps>
<Step>Assemble all frame components following blueprint 1299.</Step>
...
</Steps>
</Location>
</ManuStep>
Kueri sebelumnya hanya mengambil simpul teks. Jika Anda ingin seluruh <step
> elemen dikembalikan sebagai gantinya , hapus fungsi string() dari kueri:
B. Temukan semua bahan dan alat yang digunakan di lokasi pusat kerja kedua dalam pembuatan produk
Untuk model produk tertentu, kueri berikut mengambil alat dan bahan yang digunakan di lokasi pusat kerja kedua dalam urutan lokasi pusat kerja dalam proses manufaktur.
SELECT Instructions.query('
declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
<Location>
{ (//AWMI:root/AWMI:Location)[1]/@* }
<Tools>
{ for $s in (//AWMI:root/AWMI:Location)[1]//AWMI:step//AWMI:tool
return
<Tool>
{ string($s) }
</Tool>
}
</Tools>
<Materials>
{ for $s in (//AWMI:root/AWMI:Location)[1]//AWMI:step//AWMI:material
return
<Material>
{ string($s) }
</Material>
}
</Materials>
</Location>
') as Result
FROM Production.ProductModel
where ProductModelID=7
Perhatikan hal berikut ini dari kueri sebelumnya:
Kueri membuat <elemen Loca
tion
> dan mengambil nilai atributnya dari database.Ini menggunakan dua FLWOR (untuk ... return) iterasi: satu untuk mengambil alat dan satu untuk mengambil materi yang digunakan.
Ini adalah hasilnya:
<Location LocationID="10" SetupHours=".5"
MachineHours="3" LaborHours="2.5" LotSize="100">
<Tools>
<Tool>T-85A framing tool</Tool>
<Tool>Trim Jig TJ-26</Tool>
<Tool>router with a carbide tip 15</Tool>
<Tool>Forming Tool FT-15</Tool>
</Tools>
<Materials>
<Material>aluminum sheet MS-2341</Material>
</Materials>
</Location>
C. Mengambil dua deskripsi fitur produk pertama dari katalog produk
Untuk model produk tertentu, kueri mengambil dua deskripsi fitur pertama dari <Features
> elemen dalam katalog model produk.
SELECT CatalogDescription.query('
declare namespace p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
<ProductModel ProductModelID= "{ data( (/p1:ProductDescription/@ProductModelID)[1] ) }"
ProductModelName = "{ data( (/p1:ProductDescription/@ProductModelName)[1] ) }" >
{
for $F in /p1:ProductDescription/p1:Features
return
$F/*[position() <= 2]
}
</ProductModel>
') as x
FROM Production.ProductModel
where ProductModelID=19
Perhatikan hal berikut ini dari kueri sebelumnya:
Badan kueri membuat XML yang menyertakan <ProductModel
> elemen yang memiliki atribut ProductModelID dan ProductModelName.
- Kueri menggunakan FOR ... RETURN loop untuk mengambil deskripsi fitur model produk. Fungsi position() digunakan untuk mengambil dua fitur pertama.
Ini adalah hasilnya:
<ProductModel ProductModelID="19" ProductModelName="Mountain 100">
<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>
<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>
</ProductModel>
D. Temukan dua alat pertama yang digunakan di lokasi pusat kerja pertama dalam proses manufaktur produk
Untuk model produk, kueri ini mengembalikan dua alat pertama yang digunakan di lokasi pusat kerja pertama dalam urutan lokasi pusat kerja dalam proses manufaktur. Kueri ditentukan terhadap instruksi manufaktur yang disimpan di kolom Instruksi tabel Production.ProductModel .
SELECT Instructions.query('
declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
for $Inst in (//AWMI:root/AWMI:Location)[1]
return
<Location>
{ $Inst/@* }
<Tools>
{ for $s in ($Inst//AWMI:step//AWMI:tool)[position() <= 2]
return
<Tool>
{ string($s) }
</Tool>
}
</Tools>
</Location>
') as Result
FROM Production.ProductModel
where ProductModelID=7
Ini adalah hasilnya:
<Location LocationID="10" SetupHours=".5"
MachineHours="3" LaborHours="2.5" LotSize="100">
<Tools>
<Tool>T-85A framing tool</Tool>
<Tool>Trim Jig TJ-26</Tool>
</Tools>
</Location>
E. Temukan dua langkah manufaktur terakhir di lokasi pusat kerja pertama dalam pembuatan produk tertentu
Kueri menggunakan fungsi last() untuk mengambil dua langkah manufaktur terakhir.
SELECT Instructions.query('
declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
<LastTwoManuSteps>
<Last-1Step>
{ (/AWMI:root/AWMI:Location)[1]/AWMI:step[(last()-1)]/text() }
</Last-1Step>
<LastStep>
{ (/AWMI:root/AWMI:Location)[1]/AWMI:step[last()]/text() }
</LastStep>
</LastTwoManuSteps>') as Result
FROM Production.ProductModel
where ProductModelID=7
Ini adalah hasilnya:
<LastTwoManuSteps>
<Last-1Step>When finished, inspect the forms for defects per
Inspection Specification .</Last-1Step>
<LastStep>Remove the frames from the tool and place them in the
Completed or Rejected bin as appropriate.</LastStep>
</LastTwoManuSteps>
Lihat Juga
XML Data (SQL Server)
Referensi Bahasa XQuery (SQL Server)
Konstruksi XML (XQuery)