Bagikan melalui


Tentukan metaproperti di OPENXML

Berlaku untuk: SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Atribut metaproperty dalam dokumen XML adalah atribut yang menjelaskan properti item XML, seperti elemen, atribut, atau simpul DOM lainnya. Atribut ini tidak ada secara fisik dalam teks dokumen XML. Namun, OPENXML menyediakan metaproperti ini untuk semua item XML. Metaproperti ini memungkinkan Anda mengekstrak informasi, seperti posisi lokal dan informasi namespace, simpul XML. Informasi ini memberi Anda detail lebih lanjut daripada yang jelas dalam representasi tekstual.

Anda dapat memetakan metaproperti ini ke kolom set baris dalam pernyataan OPENXML dengan menggunakan parameter ColPattern . Kolom-kolom tersebut akan berisi nilai-nilai dari metaproperti yang dipetakan pada mereka. Untuk informasi selengkapnya tentang sintaks OPENXML, lihat OPENXML (Transact-SQL).

Untuk mengakses atribut metaproperty, disediakan namespace khusus untuk SQL Server. Namespace layanan ini, urn:schemas-microsoft-com:xml-metaprop memungkinkan pengguna untuk mengakses atribut metaproperty. Jika hasil kueri OPENXML dikembalikan dalam format tabel tepi, tabel tepi berisi satu kolom untuk setiap atribut metaproperti, kecuali xmltext metaproperti.

Beberapa atribut metaproperty digunakan untuk tujuan pemrosesan. Misalnya, xmltext atribut metaproperty digunakan untuk penanganan luapan. Penanganan luapan mengacu pada data yang tidak dikonsumsi dan tidak diolah dalam dokumen. Salah satu kolom dalam kumpulan baris yang dihasilkan oleh OPENXML dapat diidentifikasi sebagai kolom luapan. Anda melakukan ini dengan memetakannya ke xmltext metaproperti dengan menggunakan parameter ColPattern . Kolom tersebut kemudian menerima data berlebih. Parameter bendera menentukan apakah kolom berisi semuanya atau hanya data yang tidak dikonsumsi.

Tabel berikut mencantumkan atribut metaproperty yang dimiliki setiap elemen XML yang diurai. Atribut metaproperty ini dapat diakses dengan menggunakan namespace urn:schemas-microsoft-com:xml-metaprop. Nilai apa pun yang ditetapkan pengguna langsung dalam dokumen XML dengan menggunakan metaproperti ini diabaikan.

Catatan

Anda tidak dapat mereferensikan metaproperti ini di navigasi XPath apa pun.

Atribut Metaproperty Deskripsi
@mp:id Menyediakan pengidentifikasi yang berlaku untuk seluruh dokumen yang dibuat oleh sistem dari node DOM. Selama dokumen tidak direparasi, ID ini mengacu pada simpul XML yang sama.

ID 0 XML menunjukkan bahwa elemen adalah elemen root. ID XML induknya ADALAH NULL.
@mp:localname Menyimpan bagian lokal dari nama simpul. Ini digunakan dengan awalan dan URI namespace untuk memberi nama elemen atau node atribut.
@mp:namespaceuri Menyediakan URI namespace dari elemen saat ini. Jika nilai atribut ini NULL, tidak ada namespace ditemukan
@mp:prefix Menyimpan awalan namespace dari nama elemen saat ini.

Jika tidak ada awalan yang ada (NULL) dan URI diberikan, itu menunjukkan bahwa namespace yang ditentukan adalah namespace default. Jika tidak ada URI yang diberikan, tidak ada namespace yang dilampirkan.
@mp:prev Menyimpan saudara kandung sebelumnya relatif terhadap simpul. Ini menyediakan informasi tentang pengurutan elemen dalam dokumen.

@mp:prev berisi ID XML dari saudara kandung sebelumnya yang memiliki elemen induk yang sama. Jika elemen berada di bagian depan daftar saudara, @mp:prev adalah NULL.
@mp:xmltext Digunakan untuk tujuan pemrosesan. Ini adalah serialisasi tekstual elemen dan atributnya, dan juga subelemen-subelemen, sebagaimana digunakan dalam penanganan overflow OPENXML.

Tabel ini memperlihatkan properti induk tambahan yang disediakan dan yang memungkinkan Anda untuk mengambil informasi tentang hierarki.

Atribut metaproperti induk Deskripsi
@mp:parentid Sesuai dengan ../\@mp:id
@mp:parentlocalname Sesuai dengan ../\@mp:localname
@mp:parentnamespacerui Sesuai dengan ../\@mp:namespaceuri
@mp:parentprefix Sesuai dengan ../\@mp:prefix

Contoh

Contoh berikut menggambarkan bagaimana OPENXML digunakan untuk membuat tampilan set baris yang berbeda.

A. Memetakan kolom set baris OPENXML ke metaproperti

Contoh ini menggunakan OPENXML untuk membuat tampilan kumpulan baris dari contoh dokumen XML. Secara khusus, ini menunjukkan bagaimana berbagai atribut metaproperti dapat dipetakan ke kolom rowset dalam pernyataan OPENXML dengan menggunakan parameter ColPattern .

Pernyataan OPENXML mengilustrasikan hal berikut:

  • Kolom id dipetakan ke @mp:id atribut metaproperty dan menunjukkan bahwa kolom berisi ID XML unik yang dihasilkan sistem dari elemen .

  • Kolom parent dipetakan ke @mp:parentid dan menunjukkan bahwa kolom berisi ID XML dari induk elemen.

  • Kolom parentLocalName dipetakan ke @mp:parentlocalname dan menunjukkan bahwa kolom berisi nama lokal induk.

Pernyataan SELECT kemudian mengembalikan set baris yang disediakan oleh OPENXML:

DECLARE @idoc int;
DECLARE @doc nvarchar(1000);
-- Sample XML document
SET @doc = N'<root>
  <Customer cid= "C1" name="Janine" city="Issaquah">
      <Order oid="O1" date="1/20/1996" amount="3.5" />
      <Order oid="O2" date="4/30/1997" amount="13.4">Customer was very satisfied</Order>
   </Customer>
   <Customer cid="C2" name="Ursula" city="Oelde" >
      <Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue white red">
          <Urgency>Important</Urgency>
      </Order>
      <Order oid="O4" date="1/20/1996" amount="10000"/>
   </Customer>
</root>';
-- Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc;

-- Execute a SELECT statement using OPENXML rowset provider.
SELECT *
FROM OPENXML (@idoc, '/root/Customer/Order', 9)
      WITH (id int '@mp:id',
            oid char(5),
            date datetime,
            amount real,
            parentIDNo int '@mp:parentid',
            parentLocalName varchar(40) '@mp:parentlocalname');
EXEC sp_xml_removedocument @idoc;

Ini adalah hasilnya:

id   oid         date                amount    parentIDNo  parentLocalName
--- ------- ---------------------- ---------- ------------ ---------------
6    O1    1996-01-20 00:00:00.000     3.5         2        Customer
10   O2    1997-04-30 00:00:00.000     13.4        2        Customer
19   O3    1999-07-14 00:00:00.000     100.0       15       Customer
25   O4    1996-01-20 00:00:00.000     10000.0     15       Customer

B. Mengambil seluruh dokumen XML

Dalam contoh ini, OPENXML digunakan untuk membuat tampilan kumpulan baris satu kolom dari contoh dokumen XML. Kolom ini, Col1, dipetakan ke xmltext metaproperti dan menjadi kolom luapan. Akibatnya, kolom menerima data yang belum digunakan. Dalam hal ini, ini adalah seluruh dokumen.

Pernyataan SELECT kemudian mengembalikan set baris lengkap.

DECLARE @idoc int;
DECLARE @doc nvarchar(1000);
SET @doc = N'<?xml version="1.0"?>
<root>
  <Customer cid= "C1" name="Janine" city="Issaquah">
      <Order oid="O1" date="1/20/1996" amount="3.5" />
      <Order oid="O2" date="4/30/1997" amount="13.4">Customer was very
             satisfied</Order>
   </Customer>
   <Customer cid="C2" name="Ursula" city="Oelde" >
      <Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue
             white red">
     <MyTag>Testing to see if all the subelements are returned</MyTag>
          <Urgency>Important</Urgency>
      </Order>
      <Order oid="O4" date="1/20/1996" amount="10000"/>
   </Customer>
</root>';
-- Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc;

-- Execute a SELECT statement using OPENXML rowset provider.
SELECT *
FROM OPENXML (@idoc, '/')
   WITH (Col1 ntext '@mp:xmltext')

Untuk mengambil seluruh dokumen tanpa deklarasi XML, kueri dapat ditentukan seperti yang diperlihatkan dalam hal berikut:

SELECT *
FROM OPENXML (@idoc, '/root')
   WITH (Col1 ntext '@mp:xmltext')
EXEC sp_xml_removedocument @idoc;

Kueri mengembalikan elemen akar yang memiliki nama root dan data yang terkandung dalam elemen akar tersebut.

C. Menentukan metaproperti xmltext untuk mengambil data yang tidak dikonsumsi dalam kolom

Contoh ini menggunakan OPENXML untuk membuat tampilan kumpulan baris dari contoh dokumen XML. Contoh menunjukkan cara mengambil data XML yang tidak dikonsumsi dengan memetakan xmltext atribut metaproperty ke kolom set baris di OPENXML.

Kolom comment diidentifikasi sebagai kolom luapan dengan memetakannya ke @mp:xmltext metaproperti. Parameter bendera diatur ke 9 (XML_ATTRIBUTE dan XML_NOCOPY). Ini menunjukkan attribute-centric pemetaan dan menunjukkan bahwa hanya data yang tidak dikonsumsi yang harus disalin ke kolom luapan.

Pernyataan SELECT kemudian mengembalikan set baris yang disediakan oleh OPENXML.

Dalam contoh ini, @mp:parentlocalname metaproperti diatur untuk kolom, ParentLocalName, dalam himpunan baris yang dihasilkan dari OPENXML. Akibatnya, kolom ini berisi nama lokal elemen induk.

Dua kolom tambahan ditentukan dalam set baris, parent dan comment. Kolom parent dipetakan ke @mp:parentid dan menunjukkan bahwa kolom berisi ID XML dari elemen induk elemen. Kolom komentar diidentifikasi sebagai kolom luapan dengan memetakannya ke @mp:xmltext metaproperti.

DECLARE @idoc int;
DECLARE @doc nvarchar(1000);
-- sample XML document
SET @doc = N'<root>
  <Customer cid= "C1" name="Janine" city="Issaquah">
      <Order oid="O1" date="1/20/1996" amount="3.5" />
      <Order oid="O2" date="4/30/1997" amount="13.4">Customer was very satisfied</Order>
   </Customer>
   <Customer cid="C2" name="Ursula" city="Oelde" >
      <Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue white red">
          <Urgency>Important</Urgency>
      </Order>
      <Order oid="O4" date="1/20/1996" amount="10000"/>
   </Customer>
</root>
';
-- Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc;

-- Execute a SELECT statement using OPENXML rowset provider.
SELECT *
FROM OPENXML (@idoc, '/root/Customer/Order', 9)
      WITH (oid char(5),
            date datetime,
            comment ntext '@mp:xmltext');
EXEC sp_xml_removedocument @idoc;

Ini adalah hasilnya. Karena kolom oid dan kolom tanggal telah dipakai, maka kedua kolom tersebut tidak muncul di kolom overflow.

oid   date                        comment
----- --------------------------- ----------------------------------------
O1    1996-01-20 00:00:00.000     <Order amount="3.5"/>
O2    1997-04-30 00:00:00.000     <Order amount="13.4">Customer was very
                                   satisfied</Order>
O3    1999-07-14 00:00:00.000     <Order amount="100" note="Wrap it blue
                                   white red"><Urgency>
                                   Important</Urgency></Order>
O4    1996-01-20 00:00:00.000     <Order amount="10000"/>

Lihat juga