我们可以通过openxml函数和SQL server 2000中的两个系统存储过程sp_xml_preparedocument 和sp_xml_removedocument 将XML文档映射为相应的字段插进数据库。
系统存储过程sp_xml_preparedocument 用来创建一个能被插入数据库的XML文档的内部表示,即一个文件号,该系统存储过程返回一个可以用于访问XML文档的内部表示的文件号.sp_xml_removedocument 用于删除XML文档的文件号.也可以理解为,sp_xml_preparedocument 用于给XML文档分配内存空间,文件号是指向该存储空间的一个指针,通过对该文件号的操作来操作该XML文件,而sp_xml_removedocument 用于回收内存空间.
sp_xml_preparedocument存储过程的语法:
sp_xml_preparedocument handledoc OUTPUT, xmltextstring
handledoc表示待处理XML文档的文件号,作为该存储过程的输出(OUTPUT);
xmltextstring表示待处理的XML文件,以字符串的形式表示.
sp_xml_removedocument 存储过程的语法:
sp_xml_removedocument handledoc
handledoc代表待删除XML文档的文件号
openxml函数的语法:
openxml(handledoc,rowpattern,flagvalue) with tablename/definition structure
handledoc表示XML文档的文件号;
rowpattern表示用来识别XML文档有效性和节点的XPath模式的字符串,如果一个XML的根节点是BOOKS,其直接子节点是BOOK,该字符串的值为'/BOOKS/BOOK';
flagvalue表示XML文档与表字段之间的映射关系,如果该值为1表示将rowpattern的属性作为字段来进行映射,如果为2表示将rowpattern的子元素作为字段来进行映射;
tablename/definition structure表示待插入的表名,也可以是一个定义的表结构(见下例)。
DECLARE @doc varchar(1000)
DECLARE @idoc int
SET @doc = '<ROOT>
<TICKET>
<PASSENGERNAME> TOM WILKINS </PASSENGERNAME>
<AGE> 20 </AGE>
<SOURCE> CHICAGO </SOURCE>
<DESTINATION> MIAMI </DESTINATION>
<DATEOFTRAVEL> 2001-09-10 </DATEOFTRAVEL>
<CLASS> FIRST CLASS </CLASS>
<FARE> 200 </FARE>
<STATUS> Confirmed </STATUS>
</TICKET>
</ROOT>'
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
SELECT *
FROM OPENXML (@idoc, '/ROOT/TICKET', 1)
WITH (PASSENGERNAME varchar(30),
AGE int,
SOURCE CHAR(20),
DESTINATION char(20),
DATEOFTRAVEL datetime,
CLASS char(20),
FARE money,
STATUS char(20)
)
INSERT TICKET
SELECT *
FROM OPENXML(@idoc, '/ROOT/TICKET')
WITH TICKET
EXEC sp_xml_removedocument @idoc