使用BULK INSERT高效导入大量数据到SQL Server数据库
源数据 (文本文件)
下载了大量的股票历史数据, 都是文本格式的:
每个文件第一行包含股票代码, 股票名称, 数据类型. 第二行是数据列的名称:
数据表
在数据库中新建了一个数据表TestStock, 并设置以下字段, 但没有关于"成交额"的字段, 因为以后的计算不会用到这个数据. 另外这里关于价格的字段没有使用money数据类型, decimal足矣.
编写格式化文件
编写格式化文件请参考:
2. XML 格式化文件示例
当前数据的格式化文件为:
<?xml version="1.0"?> <BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <RECORD> <FIELD ID="1" xsi:type="CharTerm" TERMINATOR="," /> <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="," /> <FIELD ID="3" xsi:type="CharTerm" TERMINATOR="," /> <FIELD ID="4" xsi:type="CharTerm" TERMINATOR="," /> <FIELD ID="5" xsi:type="CharTerm" TERMINATOR="," /> <FIELD ID="6" xsi:type="CharTerm" TERMINATOR="," /> <FIELD ID="7" xsi:type="CharTerm" TERMINATOR="\r\n" /> </RECORD> <ROW> <COLUMN SOURCE="1" NAME="Date" xsi:type="SQLDATE"/> <COLUMN SOURCE="2" NAME="OpenPrice" xsi:type="SQLDECIMAL" PRECISION="6" SCALE="2" /> <COLUMN SOURCE="3" NAME="HighPrice" xsi:type="SQLDECIMAL" PRECISION="6" SCALE="2" /> <COLUMN SOURCE="4" NAME="LowPrice" xsi:type="SQLDECIMAL" PRECISION="6" SCALE="2" /> <COLUMN SOURCE="5" NAME="ClosePrice" xsi:type="SQLDECIMAL" PRECISION="6" SCALE="2" /> <COLUMN SOURCE="6" NAME="Volumn" xsi:type="SQLINT"/> </ROW> </BCPFORMAT>
暂且先保存在C盘目录下吧, 文件名叫BCPFORMAT.xml.
编写BULK INSERT语句
关于BULK INSERT的语法请参考这篇文档, 这里用到的参数主要为FORMATFILE, FIELDTERMINATOR和ROWTERMINATOR.
BULK INSERT TestStock
FROM 'C:\SH600475.txt'
WITH (
FORMATFILE = 'C:\BCPFORMAT.xml',
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\r\n' )
本来也应该用到 FIRSTROW 这个属性的, 因为我想跳过文本的前两行, 毕竟第三行开始才是真正的数据. 但我遇到了和这个帖子一样的问题, 就是设置 FIRSTROW 为3的时候, 实际上却从文本第5行的数据开始录入, 当我设置 FIRSTROW 为1(本想这次应该是从第文本3行开始录入吧), 结果报错, 说一行数据格式有问题, 后来我处理了一下数据: 在BULK INSERT语句执行前, 先删除文本的前两行, 并且在BULK INSERT语句中不指定 FIRSTROW 属性, 希望有人能告诉我这边最好应该怎么做...
执行
BULK INSERT的速度很快, 我这个例子几乎就不花时间, 而且达到了我想要的效果:
同样的效果, 如果从文本中读一行记录, 执行一次 INSERT INTO 语句的话, 需要10秒左右, 由此可见 BULK INSERT的高效.
参考
1. http://msdn.microsoft.com/zh-cn/library/ms188365.aspx
2. http://msdn.microsoft.com/zh-cn/library/ms189327.aspx
3. http://msdn.microsoft.com/zh-cn/library/ms191234.aspx
本文链接: http://www.cnblogs.com/technology/archive/2011/08/10/2133734.html
作者:Create Chen
出处:http://technology.cnblogs.com
说明:文章为作者平时里的思考和练习,可能有不当之处,请博客园的园友们多提宝贵意见。
本作品采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库