Menangani Namespace di XQuery
Berlaku untuk:SQL Server
Topik ini menyediakan sampel untuk menangani namespace dalam kueri.
Contoh
J. Mendeklarasikan namespace
Kueri berikut mengambil langkah-langkah manufaktur model produk tertentu.
SELECT Instructions.query('
declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
/AWMI:root/AWMI:Location[1]/AWMI:step
') as x
FROM Production.ProductModel
WHERE ProductModelID=7
Ini adalah hasil parsial:
<AWMI:step xmlns:AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions">Insert <AWMI:material>aluminum sheet MS-2341</AWMI:material> into the <AWMI:tool>T-85A framing tool</AWMI:tool>. </AWMI:step>
...
Perhatikan bahwa kata kunci namespace digunakan untuk menentukan awalan namespace baru, "AWMI:". Awalan ini kemudian harus digunakan dalam kueri untuk semua elemen yang termasuk dalam cakupan namespace tersebut.
B. Mendeklarasikan namespace default
Di kueri sebelumnya, awalan namespace baru ditentukan. Awalan itu kemudian harus digunakan dalam kueri untuk memilih struktur XML yang dimaksudkan. Atau, Anda dapat mendeklarasikan namespace sebagai namespace default, seperti yang diperlihatkan dalam kueri yang dimodifikasi berikut ini:
SELECT Instructions.query('
declare default element namespace "https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
/root/Location[1]/step
') as x
FROM Production.ProductModel
where ProductModelID=7
Ini adalah hasilnya
<step xmlns="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions">Insert <material>aluminum sheet MS-2341</material> into the <tool>T-85A framing tool</tool>. </step>
...
Perhatikan dalam contoh ini bahwa namespace yang ditentukan, "https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions"
, dibuat untuk mengambil alih namespace default, atau kosong. Karena itu, Anda tidak lagi memiliki awalan namespace dalam ekspresi jalur yang digunakan untuk mengkueri. Anda juga tidak lagi memiliki awalan namespace dalam nama elemen yang muncul di hasil. Selain itu, namespace default diterapkan ke semua elemen, tetapi tidak ke atributnya.
C. Menggunakan namespace dalam konstruksi XML
Saat Anda menentukan namespace baru, namespace layanan tersebut dibawa ke dalam cakupan tidak hanya untuk kueri, tetapi untuk konstruksi. Misalnya, dalam membangun XML, Anda dapat menentukan namespace baru dengan menggunakan deklarasi "declare namespace ...
" lalu menggunakan namespace layanan tersebut dengan elemen dan atribut apa pun yang Anda buat untuk muncul dalam hasil kueri.
SELECT CatalogDescription.query('
declare default element namespace "https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
declare namespace myNS="uri:SomeNamespace";<myNS:Result>
{ /ProductDescription/Summary }
</myNS:Result>
') as Result
FROM Production.ProductModel
where ProductModelID=19
Ini adalah hasilnya:
<myNS:Result xmlns:myNS="uri:SomeNamespace">
<Summary xmlns="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">
<p1:p xmlns:p1="http://www.w3.org/1999/xhtml">
Our top-of-the-line competition mountain bike. Performance-enhancing
options include the innovative HL Frame, super-smooth front
suspension, and traction for all terrain.</p1:p>
</Summary>
</myNS:Result>
Atau, Anda juga dapat menentukan namespace secara eksplisit di setiap titik di mana ia digunakan sebagai bagian dari konstruksi XML, seperti yang ditunjukkan dalam kueri berikut:
SELECT CatalogDescription.query('
declare default element namespace "https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
<myNS:Result xmlns:myNS="uri:SomeNamespace">
{ /ProductDescription/Summary }
</myNS:Result>
') as Result
FROM Production.ProductModel
where ProductModelID=19
D. Konstruksi menggunakan namespace default
Anda juga dapat menentukan namespace default untuk digunakan dalam XML yang dibangun. Misalnya, kueri berikut menunjukkan bagaimana Anda dapat menentukan namespace default, "uri:SomeNamespace"\, untuk digunakan sebagai default untuk elemen bernama lokal yang dibangun, seperti <Result>
elemen .
SELECT CatalogDescription.query('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
declare default element namespace "uri:SomeNamespace";<Result>
{ /PD:ProductDescription/PD:Summary }
</Result>
') as Result
FROM Production.ProductModel
where ProductModelID=19
Ini adalah hasilnya:
<Result xmlns="uri:SomeNamespace">
<PD:Summary xmlns:PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">
<p1:p xmlns:p1="http://www.w3.org/1999/xhtml">
Our top-of-the-line competition mountain bike. Performance-
enhancing options include the innovative HL Frame, super-smooth
front suspension, and traction for all terrain.</p1:p>
</PD:Summary>
</Result>
Perhatikan bahwa dengan mengesampingkan namespace elemen default atau namespace kosong, semua elemen bernama lokal dalam XML yang dibangun kemudian terikat ke namespace layanan default penggantian. Oleh karena itu, jika Anda memerlukan fleksibilitas dalam membangun XML untuk memanfaatkan namespace kosong, jangan ambil alih namespace elemen default.
Lihat Juga
Menambahkan Namespace ke Kueri dengan XMLNAMESPACES
XML Data (SQL Server)
Referensi Bahasa XQuery (SQL Server)