数组到SQLSERVER

northwolves 2011-03-31 07:21:56
Date Type Value
d1 a 1
d2 a 2
d3 a 3
d4 b 4
d5 a 5
d6 c 6
d7 d 7
d8 a 8
d9 b 9

通过在内存中处理,得到一个几十万行三列的二维数组,结构如上所示,请教导入到SQLSERVER的最快方法.要求:服务器已有的前两列数据更新第三列,否则添加
...全文
585 42 打赏 收藏 转发到动态 举报
写回复
用AI写文章
42 条回复
切换为时间正序
请发表友善的回复…
发表回复
dbcontrols 2011-03-31
  • 打赏
  • 举报
回复
坐等你的代码
[Quote=引用 23 楼 vbman2003 的回复:]
恩,我只是示例一下我的方法,楼主的数据要视其具体情况来定...
MEMO类型我还真没研究过,不过如果用bulk语句只能拷贝格式化的文本文件,所以要把数据写成一定格式的文本文件...
bulk语句可以参考t-sql帮助,功能还是比较多的...
比较忙,下了......
[/Quote]
vbman2003 2011-03-31
  • 打赏
  • 举报
回复
恩,我只是示例一下我的方法,楼主的数据要视其具体情况来定...
MEMO类型我还真没研究过,不过如果用bulk语句只能拷贝格式化的文本文件,所以要把数据写成一定格式的文本文件...
bulk语句可以参考t-sql帮助,功能还是比较多的...
比较忙,下了......
dbcontrols 2011-03-31
  • 打赏
  • 举报
回复
我的意思是楼主在得到二维数组的时候可以直接建成String类型的
丢了2个字
dbcontrols 2011-03-31
  • 打赏
  • 举报
回复
我也支持使用join,我的意思是楼主在得到二维数组的可以直接建成String类型的
另外,不知道你要print哪里,我觉得可以用SQL语句插入到一个MEMO字段类型的字段里,就一条记录
vbman2003 2011-03-31
  • 打赏
  • 举报
回复
"将数据先写入一个string数组中"这一步是不是可以省呢?
----------------------------------------------------
如果文件小可以打开文本文件循环数组一行行print,但如果文件大,那远不如一行行写入一个数组后再join后print,不过这二个方法的效率可以实测,到底多大的文件算大,用什么方法,可以实测数据后决定..
呵呵,只是我个人是比较喜欢用join...
dbcontrols 2011-03-31
  • 打赏
  • 举报
回复
"将数据先写入一个string数组中"这一步是不是可以省呢?

[Quote=引用 18 楼 vbman2003 的回复:]
我做过导出一个pgsql数据库的目录到sql 2000的表中,数据量近10万...
先用select语句返回一个记录集,循环这个记录集一条条insert into,在测试机器上居然用时7-8分钟,有点不能忍受...
然后尝试循环这个记录集,将数据先写入一个string数组中,然后用join一次性print这个数组到服务器上,用BULK INSERT处理,只用时10秒上下....
代码不在手边……
[/Quote]
vbman2003 2011-03-31
  • 打赏
  • 举报
回复
我做过导出一个pgsql数据库的目录到sql 2000的表中,数据量近10万...
先用select语句返回一个记录集,循环这个记录集一条条insert into,在测试机器上居然用时7-8分钟,有点不能忍受...
然后尝试循环这个记录集,将数据先写入一个string数组中,然后用join一次性print这个数组到服务器上,用BULK INSERT处理,只用时10秒上下....
代码不在手边,有时间我找一下....
northwolves 2011-03-31
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ybh37 的回复:]
还有一种绝对可行的方法:
定义一个Recordset,然后用recordset.Fields.Append加载数据。然后更新。
这个方法我用过。速度还可以。测试过百万行数据,3秒左右。
[/Quote]
具体怎么操作?更新和添加分开两步进行?
倒大霉的上帝 2011-03-31
  • 打赏
  • 举报
回复
1:由于数据量较大,而且有可能会有Update操作,所以,临时表是首选。
2:由于数据已在内存中,并且要使用临时,所以 .net下的SqlBulkCopy对象是首选。具体做法是先数组→DataTable 然后使用ColumnMappings
3:考虑到楼主主要是处理VBA下的程序,可以引用Microsoft SQLD Object Library,然后使用SQLDMO.BulkCopy对象来完成。
northwolves 2011-03-31
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 vbman2003 的回复:]
客户端文件写到服务器,只要映射一个驱动器到本地即可....BULK INSERT的文件路径,按服务器上的驱动器写...
[/Quote]
感觉可行,愿听详解
northwolves 2011-03-31
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 asftrhgjhkjlkttttttt 的回复:]
个人比较倾向于csv格式的文件,将数组数据生成到csv文件,直接引用csv文件作数据表,一条sql语句更新
[/Quote]
生成CSV格式的文件似乎也需要一定的时间
northwolves 2011-03-31
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ybh37 的回复:]
你还可以参照DTS包,把数组保存到本地磁盘文件,然后再批量导入。这样就慢了~~[/Quote]

这样理论上比较慢
vbman2003 2011-03-31
  • 打赏
  • 举报
回复
客户端文件写到服务器,只要映射一个驱动器到本地即可....BULK INSERT的文件路径,按服务器上的驱动器写...
northwolves 2011-03-31
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 dbcontrols 的回复:]
这数组是在服务器端还是在客户端没说清楚。

应该清楚地是几个平时不注意的地方:
1、网络传输是需要时间的
2、服务器的速度比客户端快,配置高
3、想办法传到服务器端,在服务器端编写存储过程,通过存储过程存储信息

4、以上是瞎说的,可以无视
[/Quote]
数组在客户端
king06 2011-03-31
  • 打赏
  • 举报
回复
    Dim arrF As Variant
Dim arrD As Variant '只能是1维数组,二维数组取1维
arrF = Array("Date", "Type", "Value")
arrD = Array("2011-03-31", "a", 1)
Set rs = New ADODB.Recordset
' 创建断开连接的记录集append,既然数据库有这些就不用了
' rs.Fields.Append "Date", adBigInt
' rs.Fields.Append "Type", adVariant
' rs.Fields.Append "Value", adVariant
rs.Open "select Date,Type,Value from xx表 "
rs.AddNew arrF, arrD
' Recordset.Update Fields, Values '---同addnew
vbman2003 2011-03-31
  • 打赏
  • 举报
回复
SQL SERVER 2000的话,最快的写入数据库的方式是先将这个数组写到服务器上的一个文本文件中,然后用BULK INSERT语句复制至数据库表或视图中,这个速度相当快,可以说比循环一条条insert inot快的不可比,数据量越大,效率越明显....因为涉及到更新原有数据,所以你可先将数据BULK INSERT到一个临时表,然后表对表用update语句联级更新后,再用select * into语句插入新数据即可...
目前能想到的就这个方法,你也可去SQL SERVER版问下....
孤独剑_LPZ 2011-03-31
  • 打赏
  • 举报
回复
个人比较倾向于csv格式的文件,将数组数据生成到csv文件,直接引用csv文件作数据表,一条sql语句更新
dbcontrols 2011-03-31
  • 打赏
  • 举报
回复
这数组是在服务器端还是在客户端没说清楚。

应该清楚地是几个平时不注意的地方:
1、网络传输是需要时间的
2、服务器的速度比客户端快,配置高
3、想办法传到服务器端,在服务器端编写存储过程,通过存储过程存储信息

4、以上是瞎说的,可以无视
咸清 2011-03-31
  • 打赏
  • 举报
回复
噢 还有比对的限制条件!
这个还需要在表中建更新触发器
咸清 2011-03-31
  • 打赏
  • 举报
回复
还有一种绝对可行的方法:
定义一个Recordset,然后用recordset.Fields.Append加载数据。然后更新。
这个方法我用过。速度还可以。测试过百万行数据,3秒左右。
加载更多回复(21)

1,216

社区成员

发帖
与我相关
我的任务
社区描述
VB 数据库(包含打印,安装,报表)
社区管理员
  • 数据库(包含打印,安装,报表)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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