Bagikan melalui


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.

Sintaksis

nodes (XQuery) as Table(Column)  

Catatan

Untuk melihat sintaks Transact-SQL untuk SQL Server 2014 (12.x) dan versi yang lebih lama, lihat Dokumentasi versi sebelumnya.

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> <Locationelemen 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 dalam ProductModel 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 ke Instructions kolom dan mengembalikan T1 (Locations) set baris. Himpunan baris ini berisi salinan logis dari dokumen instruksi manufaktur asli, dengan /root/Location elemen sebagai konteks item.

  • nodes() diterapkan ke T1 (Locations) set baris dan mengembalikan T2 (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