跪求大容量csv导入sql2000中的最快速办法。

从前现在过去了再不来 2017-07-23 04:48:29
sql2000是否可以使用 bcp bulk insert?
假设csv为

200w行

两列

格式为
1 x.x
2 x.x
...
2000000 x.x

导入sql2000数据库表 Jr

Jr表格式

3列

ID IQ Date (其中ID储存csv第一行,IQ储存csv第二行数据,date储存导入的当天日期如2017-7-23)

问题: bcp和bulk insert哪个办法最快速导入?最快用时多少秒?
两者语句如何写?
诚心跪求,困扰很久,分全送上
...全文
564 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
OwenZeng_DBA 2017-07-23
  • 打赏
  • 举报
回复
@u011293682 哈哈,客气客气,你也是。
  • 打赏
  • 举报
回复
引用 20 楼 z10843087 的回复:
[quote=引用 19 楼 u011293682 的回复:] [quote=引用 18 楼 z10843087 的回复:] @u011293682
CREATE TABLE test07232(id INT ,iq VARCHAR(300))

bulk insert test07232
from 'D:\2017-7-22.csv'
WITH (
FIELDTERMINATOR = ',',
ROWTERMINATOR = '0x0a' 
)
 

悲剧,导入成功
但是我本地
win7 64 sql2000
i7 16G prossd 机子
用时59秒

 SELECT * ,GETDATE()  AS Date INTO ttt 
 FROM test07232  
终于找到办法了,你用上面的办法试试,,前面的BULK INSERT 大概10s, select into 0 s 。如果你是服务器,IO 好些,应该可以在10s内完成。
卧槽,我i7双核 PRO ssd 2s,哈哈。大神真吊。。。 不过csv需要同时放在ssd,和数据库一个盘 刚才测试数据库ssd,csv机械盘,59s 全都都在ssd,就2s 后面插入用时1s 激动万分 然后我想想怎么把 建临时表 bulk插临时表 插正是表 删除临时表 这4步骤放进软件里一步完成 还有个小问题 插入正式表的时候 时间格式能不能只要 年月日 不需要 精确到小时分秒? [/quote] 把最后的插入正式表的语句稍微修改下就可以
 SELECT * , convert(char(10),GetDate(),120) as Date  INTO ttt1 
 FROM test07232
[/quote] 真的感谢,祝大神好人一生平安,约X成功
OwenZeng_DBA 2017-07-23
  • 打赏
  • 举报
回复
引用 19 楼 u011293682 的回复:
[quote=引用 18 楼 z10843087 的回复:] @u011293682
CREATE TABLE test07232(id INT ,iq VARCHAR(300))

bulk insert test07232
from 'D:\2017-7-22.csv'
WITH (
FIELDTERMINATOR = ',',
ROWTERMINATOR = '0x0a' 
)
 

悲剧,导入成功
但是我本地
win7 64 sql2000
i7 16G prossd 机子
用时59秒

 SELECT * ,GETDATE()  AS Date INTO ttt 
 FROM test07232  
终于找到办法了,你用上面的办法试试,,前面的BULK INSERT 大概10s, select into 0 s 。如果你是服务器,IO 好些,应该可以在10s内完成。
卧槽,我i7双核 PRO ssd 2s,哈哈。大神真吊。。。 不过csv需要同时放在ssd,和数据库一个盘 刚才测试数据库ssd,csv机械盘,59s 全都都在ssd,就2s 后面插入用时1s 激动万分 然后我想想怎么把 建临时表 bulk插临时表 插正是表 删除临时表 这4步骤放进软件里一步完成 还有个小问题 插入正式表的时候 时间格式能不能只要 年月日 不需要 精确到小时分秒? [/quote] 把最后的插入正式表的语句稍微修改下就可以
 SELECT * , convert(char(10),GetDate(),120) as Date  INTO ttt1 
 FROM test07232
  • 打赏
  • 举报
回复
引用 18 楼 z10843087 的回复:
@u011293682
CREATE TABLE test07232(id INT ,iq VARCHAR(300))

bulk insert test07232
from 'D:\2017-7-22.csv'
WITH (
FIELDTERMINATOR = ',',
ROWTERMINATOR = '0x0a' 
)
 

悲剧,导入成功
但是我本地
win7 64 sql2000
i7 16G prossd 机子
用时59秒

 SELECT * ,GETDATE()  AS Date INTO ttt 
 FROM test07232  
终于找到办法了,你用上面的办法试试,,前面的BULK INSERT 大概10s, select into 0 s 。如果你是服务器,IO 好些,应该可以在10s内完成。
卧槽,我i7双核 PRO ssd 2s,哈哈。大神真吊。。。 不过csv需要同时放在ssd,和数据库一个盘 刚才测试数据库ssd,csv机械盘,59s 全都都在ssd,就2s 后面插入用时1s 激动万分 然后我想想怎么把 建临时表 bulk插临时表 插正是表 删除临时表 这4步骤放进软件里一步完成 还有个小问题 插入正式表的时候 时间格式能不能只要 年月日 不需要 精确到小时分秒?
OwenZeng_DBA 2017-07-23
  • 打赏
  • 举报
回复
@u011293682
CREATE TABLE test07232(id INT ,iq VARCHAR(300))

bulk insert test07232
from 'D:\2017-7-22.csv'
WITH (
FIELDTERMINATOR = ',',
ROWTERMINATOR = '0x0a' 
)
 

 SELECT * ,GETDATE()  AS Date INTO ttt 
 FROM test07232  
终于找到办法了,你用上面的办法试试,,前面的BULK INSERT 大概10s, select into 0 s 。如果你是服务器,IO 好些,应该可以在10s内完成。
  • 打赏
  • 举报
回复
引用 16 楼 sinat_28984567 的回复:
[quote=引用 15 楼 u011293682 的回复:] 如果源csv的换行符无法获取,是不是就无法Bulk了?
应该可以想法处理处理,源文件是怎么来的? [/quote] 源文件是不可描述而来。。。 所以觉得不可能有修改 现在的报错
服务器: 消息 4866,级别 17,状态 66,行 1
大容量插入失败。数据文件中第 1 行、第 1 列的列太长。请确保正确地指定了字段终止符和行终止符。
服务器: 消息 7399,级别 16,状态 1,行 1
OLE DB 提供程序 'STREAM' 报错。提供程序未给出有关错误的任何信息。
OLE DB 错误跟踪[OLE/DB Provider 'STREAM' IRowset::GetNextRows returned 0x80004005:  提供程序未给出有关错误的任何信息。]。
语句已终止。
应该就是无法换行造成的
二月十六 2017-07-23
  • 打赏
  • 举报
回复
引用 15 楼 u011293682 的回复:
如果源csv的换行符无法获取,是不是就无法Bulk了?
应该可以想法处理处理,源文件是怎么来的?
  • 打赏
  • 举报
回复
引用 10 楼 sinat_28984567 的回复:
[quote=引用 9 楼 u011293682 的回复:] 大神,你是先bcp,再bulk? 我新建临时表的时候
Create Table #TEST_IP(ID Int,IQ VarChar(255),Date DateTime)  
然后bulk直接插入,就一直不行了
不是,我是把两种方式都写了一下,用哪个都行,bcp是在控制台执行的代码;bulk可以直接在数据库执行,当然bcp在数据库调用cmdshel执行l也可以…… 楼主因为你的csv数据中只有两列数据,所以临时表也应该只有两列
Create Table #TEST_IP(ID Int,IQ VarChar(255))  
[/quote] 如果源csv的换行符无法获取,是不是就无法Bulk了?
  • 打赏
  • 举报
回复
引用 13 楼 z10843087 的回复:
[quote=引用 12 楼 四块石头的回复:][quote=引用 11 楼 z10843087 的回复:] [quote=引用 7 楼 u011293682 的回复:] [quote=引用 5 楼 z10843087 的回复:] @u011293682 你的csv是以什么分隔的。你可以右键吧你的csv另存为.csv 。然后再试试
大神 我能发一份我的csv给你 测试吗?我这里一直报错,万分感谢啊[/quote]
CREATE TABLE test07232(id INT ,iq VARCHAR(300))

bulk insert test07232
from 'D:\2017-7-22new.csv'
WITH (
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n' 
)
 
 insert into 目标表
 SELECT * ,GETDATE() AS Date FROM test07232
你的csv要另存一下,我把另存的内容发给你了。 bulk insert 大概10s ,如果你是服务器肯定会快一些。[/quote] 感谢热心的大神 但是这个办法不行。打开再另存,再开始代码,这样耗时太多了 要10s内才可以啊[/quote] 之所以要另存为是因为你的csv换行符识别不到。你的csv是怎么来的,可以考虑从源头改变下[/quote] 源头不在控制范围啊,难道是这份csv无法bulk?
OwenZeng_DBA 2017-07-23
  • 打赏
  • 举报
回复
引用 12 楼 四块石头的回复:
[quote=引用 11 楼 z10843087 的回复:] [quote=引用 7 楼 u011293682 的回复:] [quote=引用 5 楼 z10843087 的回复:] @u011293682 你的csv是以什么分隔的。你可以右键吧你的csv另存为.csv 。然后再试试
大神 我能发一份我的csv给你 测试吗?我这里一直报错,万分感谢啊[/quote]
CREATE TABLE test07232(id INT ,iq VARCHAR(300))

bulk insert test07232
from 'D:\2017-7-22new.csv'
WITH (
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n' 
)
 
 insert into 目标表
 SELECT * ,GETDATE() AS Date FROM test07232
你的csv要另存一下,我把另存的内容发给你了。 bulk insert 大概10s ,如果你是服务器肯定会快一些。[/quote] 感谢热心的大神 但是这个办法不行。打开再另存,再开始代码,这样耗时太多了 要10s内才可以啊[/quote] 之所以要另存为是因为你的csv换行符识别不到。你的csv是怎么来的,可以考虑从源头改变下
  • 打赏
  • 举报
回复
引用 11 楼 z10843087 的回复:
[quote=引用 7 楼 u011293682 的回复:] [quote=引用 5 楼 z10843087 的回复:] @u011293682 你的csv是以什么分隔的。你可以右键吧你的csv另存为.csv 。然后再试试
大神 我能发一份我的csv给你 测试吗?我这里一直报错,万分感谢啊[/quote]
CREATE TABLE test07232(id INT ,iq VARCHAR(300))

bulk insert test07232
from 'D:\2017-7-22new.csv'
WITH (
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n' 
)
 
 insert into 目标表
 SELECT * ,GETDATE() AS Date FROM test07232
你的csv要另存一下,我把另存的内容发给你了。 bulk insert 大概10s ,如果你是服务器肯定会快一些。[/quote] 感谢热心的大神 但是这个办法不行。打开再另存,再开始代码,这样耗时太多了 要10s内才可以啊
OwenZeng_DBA 2017-07-23
  • 打赏
  • 举报
回复
引用 7 楼 u011293682 的回复:
[quote=引用 5 楼 z10843087 的回复:] @u011293682 你的csv是以什么分隔的。你可以右键吧你的csv另存为.csv 。然后再试试
大神 我能发一份我的csv给你 测试吗?我这里一直报错,万分感谢啊[/quote]
CREATE TABLE test07232(id INT ,iq VARCHAR(300))

bulk insert test07232
from 'D:\2017-7-22new.csv'
WITH (
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n' 
)
 
 insert into 目标表
 SELECT * ,GETDATE() AS Date FROM test07232
你的csv要另存一下,我把另存的内容发给你了。 bulk insert 大概10s ,如果你是服务器肯定会快一些。
二月十六 2017-07-23
  • 打赏
  • 举报
回复
引用 9 楼 u011293682 的回复:
大神,你是先bcp,再bulk? 我新建临时表的时候
Create Table #TEST_IP(ID Int,IQ VarChar(255),Date DateTime)  
然后bulk直接插入,就一直不行了
不是,我是把两种方式都写了一下,用哪个都行,bcp是在控制台执行的代码;bulk可以直接在数据库执行,当然bcp在数据库调用cmdshel执行l也可以…… 楼主因为你的csv数据中只有两列数据,所以临时表也应该只有两列
Create Table #TEST_IP(ID Int,IQ VarChar(255))  
  • 打赏
  • 举报
回复
引用 8 楼 sinat_28984567 的回复:
首先楼主的csv文件和表字段有不一样的,可以先把数据放到一个字段一样的临时表中; bcp:
bcp tempdb.dbo.tt in e:\test.csv -c  -Usa -P123456
bulk insert:
BULK INSERT  tempdb.dbo.tt
   FROM 'E:\test.csv';
然后再从临时表把数据插入到数据表中并加上时间
INSERT  INTO 表
        SELECT  * ,
                GETDATE()
        FROM    tempdb.dbo.tt
一般BULK INSERT比bcp要快
大神,你是先bcp,再bulk? 我新建临时表的时候
Create Table #TEST_IP(ID Int,IQ VarChar(255),Date DateTime)  
然后bulk直接插入,就一直不行了
二月十六 2017-07-23
  • 打赏
  • 举报
回复
首先楼主的csv文件和表字段有不一样的,可以先把数据放到一个字段一样的临时表中; bcp:
bcp tempdb.dbo.tt in e:\test.csv -c  -Usa -P123456
bulk insert:
BULK INSERT  tempdb.dbo.tt
   FROM 'E:\test.csv';
然后再从临时表把数据插入到数据表中并加上时间
INSERT  INTO 表
        SELECT  * ,
                GETDATE()
        FROM    tempdb.dbo.tt
一般BULK INSERT比bcp要快
  • 打赏
  • 举报
回复
引用 5 楼 z10843087 的回复:
@u011293682 你的csv是以什么分隔的。你可以右键吧你的csv另存为.csv 。然后再试试
大神 我能发一份我的csv给你 测试吗?我这里一直报错,万分感谢啊
  • 打赏
  • 举报
回复
引用 3 楼 z10843087 的回复:
@u011293682 是分2步的,不过速度还是非常快,你对性能的要求很高吗?你可以先按照上面的办法试试看时间多长,能否满足你的要求。
是啊,越快越好,期望文中所说的10秒内 目前bulk报错如上啊
OwenZeng_DBA 2017-07-23
  • 打赏
  • 举报
回复
@u011293682 你的csv是以什么分隔的。你可以右键吧你的csv另存为.csv 。然后再试试
  • 打赏
  • 举报
回复
引用 1 楼 z10843087 的回复:
[quote=引用 楼主 u011293682 的回复:] sql2000是否可以使用 bcp bulk insert? 假设csv为 200w行 两列 格式为 1 x.x 2 x.x ... 2000000 x.x 导入sql2000数据库表 Jr Jr表格式 3列 ID IQ Date (其中ID储存csv第一行,IQ储存csv第二行数据,date储存导入的当天日期如2017-7-23) 问题: bcp和bulk insert哪个办法最快速导入?最快用时多少秒? 两者语句如何写? 诚心跪求,困扰很久,分全送上
CREATE TABLE test07231(id INT ,iq DECIMAL)

bulk insert test07231
from 'D:\test2.csv'
WITH (
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n' 
)
 
 insert into 目标表
 SELECT * ,GETDATE() AS Date FROM test07231

就用bulk insert 吧,速度挺快的。例子如上,可以先导入到一个临时表中,然后用下面的查询语句插入的你实际想导入的表[/quote]
服务器: 消息 4866,级别 17,状态 66,行 1
大容量插入失败。数据文件中第 1 行、第 2 列的列太长。请确保正确地指定了字段终止符和行终止符。
服务器: 消息 7399,级别 16,状态 1,行 1
OLE DB 提供程序 'STREAM' 报错。提供程序未给出有关错误的任何信息。
OLE DB 错误跟踪[OLE/DB Provider 'STREAM' IRowset::GetNextRows returned 0x80004005:  提供程序未给出有关错误的任何信息。]。
语句已终止。
OwenZeng_DBA 2017-07-23
  • 打赏
  • 举报
回复
@u011293682 是分2步的,不过速度还是非常快,你对性能的要求很高吗?你可以先按照上面的办法试试看时间多长,能否满足你的要求。
加载更多回复(2)

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧