node() Method (xml Data Type)
Berlaku untuk: SQL ServerAzure SQL Database Azure SQL Managed Instance
Metode node() berguna saat Anda ingin menghancurkan instans jenis data xml ke dalam data relasional. Ini memungkinkan Anda mengidentifikasi simpul yang akan dipetakan ke dalam baris baru.
Setiap instans jenis data xml memiliki simpul konteks yang disediakan secara implisit. Untuk instans XML yang disimpan dalam kolom atau variabel, simpul ini adalah simpul dokumen. Simpul dokumen adalah simpul implisit di bagian atas setiap instans jenis data xml .
Hasil metode node() adalah set baris yang berisi salinan logis dari instans XML asli. Dalam salinan logis ini, simpul konteks setiap instans baris diatur ke salah satu simpul yang diidentifikasi dengan ekspresi kueri. Dengan cara ini, kueri selanjutnya dapat menavigasi relatif terhadap simpul konteks ini.
Anda dapat mengambil beberapa nilai dari set baris. Misalnya, Anda dapat menerapkan metode value() ke set baris yang dikembalikan oleh node() dan mengambil beberapa nilai dari instans XML asli. Metode value(), saat diterapkan ke instans XML, hanya mengembalikan satu nilai.
Sintaks
nodes (XQuery) as Table(Column)
Argumen
XQuery
Adalah string literal, ekspresi XQuery. Jika ekspresi kueri membuat simpul, simpul yang dibangun ini akan diekspos dalam set baris yang dihasilkan. Jika ekspresi kueri menghasilkan urutan kosong, set baris juga kosong. Jika ekspresi kueri secara statis menghasilkan urutan yang berisi nilai atomik alih-alih simpul, kesalahan statis dimunculkan.
Table(Column)
Adalah nama tabel dan nama kolom untuk kumpulan baris yang dihasilkan.
Keterangan
Sebagai contoh, asumsikan bahwa Anda memiliki tabel berikut:
T (ProductModelID INT, Instructions XML)
Dokumen instruksi manufaktur berikut disimpan dalam tabel. Hanya fragmen yang ditampilkan. Perhatikan bahwa ada tiga lokasi manufaktur dalam dokumen.
<root>
<Location LocationID="10"...>
<step>...</step>
<step>...</step>
...
</Location>
<Location LocationID="20" ...>
...
</Location>
<Location LocationID="30" ...>
...
</Location>
</root>
Pemanggilan nodes()
metode dengan ekspresi /root/Location
kueri akan mengembalikan set baris dengan tiga baris, masing-masing berisi salinan logis dokumen XML asli, dan dengan item konteks yang diatur ke salah <Location>
satu simpul:
Product
ModelID Instructions
----------------------------------
1 <root><Location LocationID="10" ... />
<Location LocationID="20" ... />
<Location LocationID="30" .../></root>
1 <root><Location LocationID="10" ... />
<Location LocationID="20" ... />
<Location LocationID="30" .../></root>
1 <root><Location LocationID="10" ... />
<Location LocationID="20" ... />
<Location LocationID="30" .../></root>
Anda kemudian dapat mengkueri himpunan baris ini dengan menggunakan metode tipe data xml . Kueri berikut mengekstrak subtree item konteks untuk setiap baris yang dihasilkan:
SELECT T2.Loc.query('.')
FROM T
CROSS APPLY Instructions.nodes('/root/Location') AS T2(Loc)
Berikut adalah hasilnya:
ProductModelID Instructions
----------------------------------
1 <Location LocationID="10" ... />
1 <Location LocationID="20" ... />
1 <Location LocationID="30" .../>
Kumpulan baris yang dikembalikan telah mempertahankan informasi jenis. Anda dapat menerapkan metode tipe data xml, seperti query(), value(), exist(), dan node(), ke hasil metode node(). Namun, Anda tidak dapat menerapkan metode modifikasi() untuk mengubah instans XML.
Selain itu, simpul konteks dalam set baris tidak dapat diwujudkan. Artinya, Anda tidak dapat menggunakannya dalam pernyataan SELECT. Namun, Anda dapat menggunakannya di IS NULL dan COUNT(*).
Skenario untuk menggunakan metode node() sama dengan untuk menggunakan OPENXML (Transact-SQL), yang menyediakan tampilan set baris XML. Namun, Anda tidak perlu menggunakan kursor saat menggunakan metode node() pada tabel yang berisi beberapa baris dokumen XML.
Kumpulan baris yang dikembalikan oleh metode node() adalah set baris yang tidak disebutkan namanya. Jadi, itu harus secara eksplisit dinamai dengan menggunakan aliasing.
Fungsi node() tidak dapat diterapkan langsung ke hasil fungsi yang ditentukan pengguna. Untuk menggunakan fungsi node() dengan hasil fungsi skalar yang ditentukan pengguna, Anda dapat:
- Menetapkan hasil fungsi yang ditentukan pengguna ke variabel
- Gunakan tabel turunan untuk menetapkan alias kolom ke nilai pengembalian fungsi yang ditentukan pengguna lalu gunakan
CROSS APPLY
untuk memilih dari alias.
Contoh berikut menunjukkan salah satu cara untuk digunakan CROSS APPLY
untuk memilih dari hasil fungsi yang ditentukan pengguna.
USE AdventureWorks;
GO
CREATE FUNCTION XTest()
RETURNS XML
AS
BEGIN
RETURN '<document/>';
END;
GO
SELECT A2.B.query('.')
FROM
(SELECT dbo.XTest()) AS A1(X)
CROSS APPLY X.nodes('.') A2(B);
GO
DROP FUNCTION XTest;
GO
Contoh
Menggunakan metode node() terhadap variabel jenis xml
Dalam contoh berikut, ada dokumen XML yang memiliki <Root
> elemen tingkat atas dan tiga <row
> elemen turunan. Kueri menggunakan nodes()
metode untuk mengatur simpul konteks terpisah, satu untuk setiap <row
> elemen. Metode mengembalikan nodes()
set baris dengan tiga baris. Setiap baris memiliki salinan logis XML asli, dengan setiap simpul konteks mengidentifikasi elemen yang berbeda <row
> dalam dokumen asli.
Kueri kemudian mengembalikan simpul konteks dari setiap baris:
DECLARE @x XML
SET @x='<Root>
<row id="1"><name>Larry</name><oflw>some text</oflw></row>
<row id="2"><name>moe</name></row>
<row id="3" />
</Root>'
SELECT T.c.query('.') AS result
FROM @x.nodes('/Root/row') T(c)
GO
Dalam contoh hasil berikut, metode kueri mengembalikan item konteks dan kontennya:
<row id="1"><name>Larry</name><oflw>some text</oflw></row>
<row id="2"><name>moe</name></row>
<row id="3"/>
Menerapkan pengakses induk pada simpul konteks mengembalikan elemen untuk ketiganya <Root
> :
SELECT T.c.query('..') AS result
FROM @x.nodes('/Root/row') T(c)
GO
Berikut adalah hasilnya:
<Root>
<row id="1"><name>Larry</name><oflw>some text</oflw></row>
<row id="2"><name>moe</name></row>
<row id="3" />
</Root>
<Root>
<row id="1"><name>Larry</name><oflw>some text</oflw></row>
<row id="2"><name>moe</name></row>
<row id="3" />
</Root>
<Root>
<row id="1"><name>Larry</name><oflw>some text</oflw></row>
<row id="2"><name>moe</name></row>
<row id="3" />
</Root>
Menentukan metode node() terhadap kolom jenis xml
Instruksi manufaktur sepeda digunakan dalam contoh ini dan disimpan di kolom Jenis xml instruksi dari tabel ProductModel.
Dalam contoh berikut, nodes()
metode ditentukan terhadap Instructions
kolom jenis xml dalam ProductModel
tabel.
Metode nodes()
ini mengatur> <Location
elemen sebagai simpul konteks dengan menentukan /MI:root/MI:Location
jalur. Himpunan baris yang dihasilkan mencakup salinan logis dari dokumen asli, satu untuk setiap <Location
> simpul dalam dokumen, dengan simpul konteks diatur ke <Location
> elemen . Akibatnya, nodes()
fungsi memberikan serangkaian <Location
> simpul konteks.
Metode query()
terhadap set baris ini meminta self::node
dan mengembalikan <Location>
elemen di setiap baris.
Dalam contoh ini, kueri menetapkan setiap <Location
> elemen sebagai simpul konteks dalam dokumen instruksi manufaktur model produk tertentu. Anda dapat menggunakan simpul konteks ini untuk mengambil nilai seperti ini:
Temukan ID Lokasi di masing-masing <
Location
>Mengambil langkah-langkah manufaktur (<
step
> elemen turunan) di masing-masing <Location
>
Kueri ini mengembalikan item konteks, di mana sintaks '.'
yang disingkat untuk self::node()
ditentukan, dalam query()
metode .
Berikut hal-hal yang perlu diketahui:
Metode
nodes()
diterapkan ke kolom Instruksi dan mengembalikan set baris,T (C)
. Himpunan baris ini berisi salinan logis dari dokumen instruksi manufaktur asli dengan/root/Location
sebagai item konteks.CROSS APPLY berlaku
nodes()
untuk setiap baris dalamProductModel
tabel dan hanya mengembalikan baris yang menghasilkan tataan hasil.SELECT C.query('.') as result FROM Production.ProductModel CROSS APPLY Instructions.nodes(' declare namespace MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions"; /MI:root/MI:Location') as T(C) WHERE ProductModelID=7
Berikut adalah hasil parsial:
<MI:Location LocationID="10" ...> <MI:step ... /> ... </MI:Location> <MI:Location LocationID="20" ... > <MI:step ... /> ... </MI:Location> ...
Menerapkan simpul() ke set baris yang dikembalikan oleh metode node() lain
Kode berikut mengkueri dokumen XML untuk instruksi manufaktur di Instructions
kolom ProductModel
tabel. Kueri mengembalikan set baris yang berisi ID model produk, lokasi manufaktur, dan langkah-langkah manufaktur.
Berikut hal-hal yang perlu diketahui:
Metode
nodes()
diterapkan keInstructions
kolom dan mengembalikanT1 (Locations)
set baris. Himpunan baris ini berisi salinan logis dari dokumen instruksi manufaktur asli, dengan/root/Location
elemen sebagai konteks item.nodes()
diterapkan keT1 (Locations)
set baris dan mengembalikanT2 (steps)
set baris. Himpunan baris ini berisi salinan logis dari dokumen instruksi manufaktur asli, dengan/root/Location/step
elemen sebagai konteks item.
SELECT ProductModelID, Locations.value('./@LocationID','int') AS LocID,
steps.query('.') AS Step
FROM Production.ProductModel
CROSS APPLY Instructions.nodes('
declare namespace MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
/MI:root/MI:Location') AS T1(Locations)
CROSS APPLY T1.Locations.nodes('
declare namespace MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
./MI:step ') AS T2(steps)
WHERE ProductModelID=7
GO
Berikut adalah hasilnya:
ProductModelID LocID Step
----------------------------
7 10 <step ... />
7 10 <step ... />
...
7 20 <step ... />
7 20 <step ... />
7 20 <step ... />
...
Kueri mendeklarasikan awalan MI
dua kali. Sebagai gantinya, Anda dapat menggunakan WITH XMLNAMESPACES
untuk mendeklarasikan awalan satu kali dan menggunakannya dalam kueri:
WITH XMLNAMESPACES (
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions' AS MI)
SELECT ProductModelID, Locations.value('./@LocationID','int') AS LocID,
steps.query('.') AS Step
FROM Production.ProductModel
CROSS APPLY Instructions.nodes('
/MI:root/MI:Location') AS T1(Locations)
CROSS APPLY T1.Locations.nodes('
./MI:step ') as T2(steps)
WHERE ProductModelID=7
GO
Lihat Juga
Menambahkan Namespace ke Kueri dengan XMLNAMESPACES
Membuat Instans Data XML
Metode Tipe Data xml