将数据批量写入数据库的需求是比较多的,方法也有很多种,在.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文件的数据组合成一个字符串了,然后就可以用上面的方法将数据导入到数据库了。