您的位置:首页 > 数据库

批量写数据---将XML数据批量写入数据库

2008-05-24 03:05 344 查看
将数据批量写入数据库的需求是比较多的,方法也有很多种,在.net 里使用程序比较好的方法是使用 Bulk Copy 将大量数据复制到数据库 。如果数据源为XML文件,使用SQL BULK COPY就需要将XML数据导入到DataTable,下面的方法可以直接将XML数据传到SQL SERVER然后处理,另外还可以直接使用T-SQL将XML文件的数据导入到数据库。

这里最主要的是要使用二个系统存储过程:SP_XML_PREPAREDOCUMENT 和 SP_XML_REMOVEDOCUMENT

SP_XML_PREPAREDOCUMENT 的功能是:读取XML文件后使用 MSXML 分析器 (Msxmlsql.dll) 对XML数据进行分析,并提供分析后的文档供使用。分析后得到的数据是对 XML 文件中的各节点(元素、属性、文本和注释等)以树状形式表现。分析后的数据存储在 SQL Server 的内部缓存中。

SP_XML_REMOVEDOCUMENT 的功能是:根据文档句柄释放文档所占的内存。

先建立一个XML字符串和一个表:

<?xml version="1.0"?>

<ROOT>

<USER ID="1" Name="SBQCEL"/>

<USER ID="2" Name="PEACELI"/>

<USER ID="3" Name="SHEEPCHANG"/>

</ROOT>

CREATE TABLE Users

(

UserId INT,

UserName VARCHAR(20)

)
处理的方法很简单:

DECLARE @HDOC INT --文档句柄

DECLARE @XMLSTRING VARCHAR(200) --XML字符串

SET @xmlString ='<?xml version="1.0"?>

<ROOT>

<USER ID="1" Name="SBQCEL"/>

<USER ID="2" Name="PEACELI"/>

<USER ID="3" Name="SHEEPCHANG"/>

</ROOT>'

--使用系统存储过程SP_XML_PREPAREDOCUMENT分析XML字符串

EXEC SP_XML_PREPAREDOCUMENT @HDOC OUTPUT, @XMLSTRING

--使用OPENXML从SQL Server 的内部缓存查询数据

INSERT INTO Users SELECT * FROM OPENXML(@HDOC,N'/ROOT/USER')

WITH

(

ID INT,

Name VARCHAR(10)

)

--使用系统存储过程SP_XML_REMOVEDOCUMENT释放内存

EXEC SP_XML_REMOVEDOCUMENT @HDOC
如果要用T-SQL直接读取一个XML文件并将数据导入到表里,需要做一些额外的处理:先要用XP_CMDSHELL将XML数据读到一个临时表(变量表),然后将每行数据组合成一个字符串,再用上面的方法处理。需要注意的是XP_CMDSHELL以行来处理数据的。下面是一个简单的事例:

--定义一个变量表临时存储调用XP_CMDSHELL后得到的数据

DECLARE @TEMP TABLE

(

ID INT IDENTITY(1,1),

XMLSTRING VARCHAR(200)

)

--使用XP_CMDSHELL将XML文件的数据插入到变量表里

INSERT INTO @TEMP EXEC MASTER.DBO.XP_CMDSHELL 'TYPE E:\A.XML'

DECLARE @LOOP INT, --循环计数

@COUNT INT, --行数

@XMLSTRING VARCHAR(200) --存储XML字符串

SELECT @LOOP = 1, --从第1行开始

@XMLSTRING='', --初始化

@COUNT = (SELECT COUNT(1) FROM @TEMP) --获得行数

--做一个循环,将数据组合成一个字符串以便处理

WHILE (@LOOP<=@COUNT)

BEGIN

SELECT @XMLSTRING = @XMLSTRING + XMLSTRING FROM @TEMP WHERE ID = @LOOP

SET @LOOP = @LOOP + 1

END

--查看处理结果

SELECT @XMLSTRING
用上面的方法处理后就将一个XML文件的数据组合成一个字符串了,然后就可以用上面的方法将数据导入到数据库了。

处理XML文件的更好的办法是用OPENROWSET读取数据放入一个XML类型的变量,再处理

代码

DECLARE @HDOC INT --文档句柄

DECLARE @XML XML

SELECT @XML = BULKCOLUMN FROM OPENROWSET(BULK 'E:\A.xml',SINGLE_BLOB) AS TEMP

--使用系统存储过程SP_XML_PREPAREDOCUMENT分析XML字符串

EXEC SP_XML_PREPAREDOCUMENT @HDOC OUTPUT, @XML

--使用OPENXML从SQL Server 的内部缓存查询数据

SELECT * FROM OPENXML(@HDOC,N'/ROOT/USER')

WITH

(

ID INT,

Name VARCHAR(10)

)

--使用系统存储过程SP_XML_REMOVEDOCUMENT释放内存

EXEC SP_XML_REMOVEDOCUMENT @HDOC
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: