XML文档插入SQL Server2000数据库(1)

时间:2022-11-14 13:20:24

我们可以通过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