大容量csv快速内导入sqlserver的解决方法是什么

65次阅读
没有评论

共计 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 的解决方法是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-17发表,共计1056字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)