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.
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:MyNamespace
layanan .
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"/>';