共计 1056 个字符,预计需要花费 3 分钟才能阅读完成。
这篇文章将为大家详细讲解有关大容量 csv 快速内导入 sqlserver 的解决方法是什么,文章内容质量较高,因此丸趣 TV 小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
前言
在论坛中回答了一个问题,导入 csv 数据,并对导入的数据增加一个新的列 date datetime。要求在 10s 内完成,200w 行数据的导入. 分享下解决问题的思路和方法
分析
通常来讲 Bulk insert 比 BCP 更快一点,我们选择 Bulk insert 的方式。提出的解决方案:先把数据导入到 sql server 的临时表,然后再插入目标表。具体语句如下:
bulk insert test07232 from D:\2017-7-22.csv WITH ( FIELDTERMINATOR = , , ROWTERMINATOR = /n )SELECT * ,GETDATE() AS Date INTO ttt FROM test07232
但是他提供的的 csv 进行导入时,提示如下错误
消息 4866,级别 16,状态 1,第 1 行 大容量加载失败。数据文件中第 1 行的第 2 列太长。请验证是否正确指定了字段终止符和行终止符。消息 7399,级别 16,状态 1,第 1 行 链接服务器 (null) 的 OLE DB 访问接口 BULK 报错。提供程序未给出有关错误的任何信息。
消息 7330,级别 16,状态 2,第 1 行 无法从链接服务器 (null) 的 OLE DB 访问接口 BULK 提取行。
这是由于行终止符无法识别导致的。使用 notepad++ 打开 csv 文件,在视图中选择显示行尾号。
可以看到文件的换行符是 LF
而对于正常的 csv 问题 默认是用 CRLF 作为换行符的
因此上面的 bulk insert 语句无法正常执行。
解决
1. 首先想到的是修改数据源头,让源头产生正常的数据,但是源头数据不好修改 2. 用程序,写 c# 处理,,太费时间 3. 最后终于找到了正确的办法
bulk insert test07232 from D:\2017-7-22.csv WITH ( FIELDTERMINATOR = , , ROWTERMINATOR = 0x0a )SELECT * ,GETDATE() AS Date INTO ttt FROM test07232
最后全部都在 SSD 上,导入用时 2s。生产正式表 1s。整个过程 3s 完成。
关于大容量 csv 快速内导入 sqlserver 的解决方法是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。