惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
aimingoo的专栏
aimingoo的专栏
爱范儿
爱范儿
D
Docker
I
InfoQ
Microsoft Security Blog
Microsoft Security Blog
G
Google Developers Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Vercel News
Vercel News
H
Hackread – Cybersecurity News, Data Breaches, AI and More
T
Tailwind CSS Blog
D
DataBreaches.Net
月光博客
月光博客
N
Netflix TechBlog - Medium
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
V
Visual Studio Blog
MyScale Blog
MyScale Blog
B
Blog
阮一峰的网络日志
阮一峰的网络日志
L
LangChain Blog
Recent Announcements
Recent Announcements
Microsoft Azure Blog
Microsoft Azure Blog
WordPress大学
WordPress大学

博客园 - 空空儿

硬盘分区、寻址和系统启动过程 JavaScript里String.Format方法的实现 asp.net异步页 获取SQL Server数据行的物理地址信息(%%lockress%% & %%physloc%%) 利用Spire.DataExport将数据(Database/DataTable)导成各种文件 使用XML的value()方法将多行数据合并成一列 获取所有的外键信息 ASP.NET application and page life cycle SQL Server 2005 CLR 调用Web Service需要注意的几个问题 SQL SERVRE 2005 CLR TVF错误:从用户定义的表值函数获取新行时出错:Data access is not allowed in this context. PHP执行MYSQL存储过程报错:Commands out of sync; you can't run this command now 在C#里使用属性 - 空空儿 - 博客园 Read text file (txt, csv, log, tab, fixed length) 对对象类型和调用方法属性进行存储以提升反射性能 过程 sp_addlinkedsrvlogin,第 91 行解密过程中出错的解决办法 生成大量随机字符串不同实现方式的效率对比 用SQL SERVER 2005新提供的命令实现行列转换 APM (异步编程模型) 利用宏让ERStudio生成代码文件
批量写数据---将XML数据批量写入数据库
空空儿 · 2008-05-24 · via 博客园 - 空空儿

    将数据批量写入数据库的需求是比较多的,方法也有很多种,在.net 里使用程序比较好的方法是使用 Bulk Copy 将大量数据复制到数据库 。如果数据源为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(1FROM @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