批量写数据

 将数据批量写入数据库的需求是比较多的,方法也有很多种。如果数据源为XML文件,使用SQL BULK COPY就需要将XML数据导入到DataTable,下面的方法可以直接将XML数据传到SQL SERVER然后处理,另外还可以直接使用T-SQL将XML文件的数据导入到数据库。
这里最主要的是要使用二个系统存储过程:SP_XML_PREPAREDOCUMENTSP_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文件的数据组合成一个字符串了,然后就可以用上面的方法将数据导入到数据库了。

你可能感兴趣的:(sql,xml,server,存储,文档,sqlserver,OpenXml)