Bagikan melalui


sp_xml_preparedocument (T-SQL)

Berlaku untuk: SQL ServerAzure SQL Database

Membaca teks XML yang disediakan sebagai input, mengurai teks dengan menggunakan pengurai MSXML (msxmlsql.dll), dan menyediakan dokumen yang diurai dalam status siap untuk dikonsumsi. Dokumen yang diurai ini adalah representasi pohon dari berbagai simpul dalam dokumen XML: elemen, atribut, teks, komentar, dan sebagainya.

sp_xml_preparedocument mengembalikan handel yang dapat digunakan untuk mengakses representasi internal dokumen XML yang baru dibuat. Handel ini valid selama sesi, atau sampai handel tidak valid dengan menjalankan sp_xml_removedocument.

Dokumen yang diurai disimpan dalam cache internal SQL Server. Pengurai MSXML dapat menggunakan satu perdelapan dari total memori yang tersedia untuk SQL Server. Untuk menghindari kehabisan memori, jalankan sp_xml_removedocument untuk membebaskan memori segera setelah dokumen tidak lagi diperlukan. Dalam banyak kasus, metode node() mungkin merupakan alternatif yang lebih baik, dan membantu menghindari penggunaan memori yang berlebihan.

Untuk kompatibilitas mundur, sp_xml_preparedocument ciutkan karakter CR (char(13)) dan LF (char(10)) dalam atribut bahkan jika karakter ini diberi entitas.

Catatan

Pengurai XML yang dipanggil oleh sp_xml_preparedocument dapat mengurai DTD internal dan deklarasi entitas. Karena DTD dan deklarasi entitas yang dibangun dengan berbahaya dapat digunakan untuk melakukan penolakan serangan layanan, kami sangat menyarankan agar pengguna tidak langsung meneruskan dokumen XML dari sumber yang tidak tepercaya ke sp_xml_preparedocument.

Untuk mengurangi serangan ekspansi entitas rekursif, sp_xml_preparedocument batasi hingga 10.000 jumlah entitas yang dapat diperluas di bawah satu entitas di tingkat atas dokumen. Batas tidak berlaku untuk entitas karakter atau numerik. Batas ini memungkinkan dokumen dengan banyak referensi entitas disimpan, tetapi mencegah satu entitas diperluas secara rekursif dalam rantai yang lebih lama dari 10.000 ekspansi.

sp_xml_preparedocument membatasi jumlah elemen yang dapat dibuka pada satu waktu hingga 256.

Konvensi sintaks transact-SQL

Sintaks

sp_xml_preparedocument hdoc OUTPUT
    [ , xmltext ]
    [ , xpath_namespaces ]
[ ; ]

Argumen

hdoc

Handel ke dokumen yang baru dibuat. hdoc adalah bilangan bulat.

[ xmltext ]

Dokumen XML asli. Pengurai MSXML mengurai dokumen XML ini. xmltext adalah parameter teks: char, nchar, varchar, nvarchar, text, ntext atau xml. Nilai defaultnya adalah NULL, dalam hal ini representasi internal dokumen XML kosong dibuat.

Catatan

sp_xml_preparedocument hanya dapat memproses teks atau XML yang tidak dititik. Jika nilai instans yang akan digunakan sebagai input sudah diketik XML, pertama-tama transmisikan ke instans XML baru yang tidak diketik atau sebagai string lalu teruskan nilai tersebut sebagai input. Untuk informasi selengkapnya, lihat Membandingkan XML Yang Ditik dengan XML Yang Tidak Ditiru.

[ xpath_namespaces ]

Menentukan deklarasi namespace yang digunakan dalam ekspresi baris dan kolom XPath di OPENXML. xpath_namespaces adalah parameter teks: char, nchar, varchar, nvarchar, text, ntext atau xml.

Nilai defaultnya adalah <root xmlns:mp="urn:schemas-microsoft-com:xml-metaprop">. xpath_namespaces menyediakan URI namespace untuk awalan yang digunakan dalam ekspresi XPath di OPENXML, dengan dokumen XML yang terbentuk dengan baik. xpath_namespaces mendeklarasikan awalan yang harus digunakan untuk merujuk ke namespace urn:schemas-microsoft-com:xml-metaprop; ini menyediakan metadata tentang elemen XML yang diurai. Meskipun Anda dapat menentukan ulang awalan namespace untuk namespace layanan metaproperti dengan menggunakan teknik ini, namespace layanan ini tidak hilang. Awalan mp masih berlaku urn:schemas-microsoft-com:xml-metaprop meskipun xpath_namespaces tidak berisi deklarasi tersebut.

Mengembalikan nilai kode

0 (berhasil) atau > 0 (kegagalan).

Izin

Memerlukan keanggotaan dalam peran publik .

Contoh

J. Menyiapkan representasi internal untuk dokumen XML yang terbentuk dengan baik

Contoh berikut mengembalikan handel ke representasi internal dokumen XML yang baru dibuat yang disediakan sebagai input. Dalam panggilan ke sp_xml_preparedocument, pemetaan awalan namespace default digunakan.

DECLARE @hdoc INT;
DECLARE @doc VARCHAR(1000);

SET @doc = '
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot">
   <Order CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00">
      <OrderDetail OrderID="10248" ProductID="11" Quantity="12"/>
      <OrderDetail OrderID="10248" ProductID="42" Quantity="10"/>
   </Order>
</Customer>
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">
   <Order CustomerID="LILAS" EmployeeID="3" OrderDate="1996-08-16T00:00:00">
      <OrderDetail OrderID="10283" ProductID="72" Quantity="3"/>
   </Order>
</Customer>
</ROOT>';

--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc;

-- Remove the internal representation.
EXEC sp_xml_removedocument @hdoc;

B. Menyiapkan representasi internal untuk dokumen XML yang terbentuk dengan baik dengan DTD

Contoh berikut mengembalikan handel ke representasi internal dokumen XML yang baru dibuat yang disediakan sebagai input. Prosedur tersimpan memvalidasi dokumen yang dimuat terhadap DTD yang disertakan dalam dokumen. Dalam panggilan ke sp_xml_preparedocument, pemetaan awalan namespace default digunakan.

DECLARE @hdoc int;
DECLARE @doc varchar(2000);
SET @doc = '
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE root
[<!ELEMENT root (Customers)*>
<!ELEMENT Customers EMPTY>
<!ATTLIST Customers CustomerID CDATA #IMPLIED ContactName CDATA #IMPLIED>]>
<root>
<Customers CustomerID="ALFKI" ContactName="Maria Anders"/>
</root>';

EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc;

C. Tentukan URI namespace layanan

Contoh berikut mengembalikan handel ke representasi internal dokumen XML yang baru dibuat yang disediakan sebagai input. Panggilan untuk sp_xml_preparedocument mempertahankan mp awalan ke pemetaan namespace layanan metaproperti dan menambahkan xyz awalan pemetaan ke namespace urn:MyNamespacelayanan .

DECLARE @hdoc int;
DECLARE @doc varchar(1000);
SET @doc ='
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot">
   <Order CustomerID="VINET" EmployeeID="5"
           OrderDate="1996-07-04T00:00:00">
      <OrderDetail OrderID="10248" ProductID="11" Quantity="12"/>
      <OrderDetail OrderID="10248" ProductID="42" Quantity="10"/>
   </Order>
</Customer>
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">
   <Order CustomerID="LILAS" EmployeeID="3"
           OrderDate="1996-08-16T00:00:00">
      <OrderDetail OrderID="10283" ProductID="72" Quantity="3"/>
   </Order>
</Customer>
</ROOT>'
--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc, '<ROOT xmlns:xyz="urn:MyNamespace"/>';