首页 新闻 会员 周边

sql server 执行大批量的update

0
悬赏园豆:30 [已解决问题] 解决于 2014-09-25 13:23

使用的数据库是sql server,现在有大批量的数据需要更新,更新的要求是根据ID把某一个字段换成一个新值,每次大概处理上千条数据。大家有没有什么好的解决方案?拼接字符串就不用说了。

问题补充:

元县没有说清楚,如图,数据库中有这么一张表,现在这个表中的ResCode过时了,我从别的地方获得了新的一批数据,新数据的格式和内容和图中的差不多,但Rescode这一列是不一样的,现在我要做的是把新的数据中的ResCode更新到数据库中,由于一些其他的原因,这些数据对应的ResID是不能变的。

最长的路漫漫的主页 最长的路漫漫 | 菜鸟二级 | 园豆:252
提问于:2014-09-17 13:24
< >
分享
最佳答案
0

规则是啥?能否在sql语句中直接实现规则?update table set xx=id+1 。

收获园豆:30
幻天芒 | 高人七级 |园豆:37175 | 2014-09-17 13:53

规则见一楼回复

最长的路漫漫 | 园豆:252 (菜鸟二级) | 2014-09-17 13:56

@最长的路漫漫: 你那是规则吗?

l,k,j,h,g哪来的?

爱编程的大叔 | 园豆:30839 (高人七级) | 2014-09-17 14:18

@爱编程的大叔: lkjhg这些是从别的地方更新过来的,现在要把对应ID的Value给换掉

最长的路漫漫 | 园豆:252 (菜鸟二级) | 2014-09-17 14:22

@爱编程的大叔: 我也想说,这哪叫规则啊~

幻天芒 | 园豆:37175 (高人七级) | 2014-09-17 15:33

@最长的路漫漫: 如果是别的表更新,那肯定有关联关系,那么使用连表更新即可。

幻天芒 | 园豆:37175 (高人七级) | 2014-09-17 15:33

@幻天芒: 刚才问题没有说清楚,我刚刚把问题补充了一下

最长的路漫漫 | 园豆:252 (菜鸟二级) | 2014-09-17 15:51

@最长的路漫漫: 基本就是连表更新,一句话的事情。

幻天芒 | 园豆:37175 (高人七级) | 2014-09-17 16:00

@幻天芒: 可是新的数据不在数据库里,是通过程序获取的,在内存里啊

最长的路漫漫 | 园豆:252 (菜鸟二级) | 2014-09-17 16:08

@最长的路漫漫: 既然不在数据库,我可以先写入数据库,这个在代码中构造一个datatable,刷到数据库即可。或者直接开一个事务,执行几千次更新也是很快的。不要考虑那么多效率,这点东西,还没到那个地步。

幻天芒 | 园豆:37175 (高人七级) | 2014-09-17 16:20

@最长的路漫漫: 可以分享下最后选择的方案~

幻天芒 | 园豆:37175 (高人七级) | 2014-09-25 14:52
其他回答(5)
0

是把某一个字段的值放到另一个字段里面还是把某个字段里面的某个值换成新值?

晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-17 13:48

把这个值换成新值,比如,原先的记录是这样的

ID Value
1 a
2 b
3 c
4 d
5 e

现在要修改成

ID Value
1 l
2 k
3 j
4 h
5 g

ID是自增长的,而且与别的表有关联,不能先删除后插入

支持(0) 反对(0) 最长的路漫漫 | 园豆:252 (菜鸟二级) | 2014-09-17 13:55

@最长的路漫漫: 那你的新增是从别的表里获取还是怎么得到?

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-17 14:31

@晓菜鸟: 这些数据是从别地方更新过来的

支持(0) 反对(0) 最长的路漫漫 | 园豆:252 (菜鸟二级) | 2014-09-17 14:36

@最长的路漫漫: ResID一样就可以。

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-17 20:16
1

1000多条数据,最佳方案如下:

请一个农民工,每月发工资800,每分钟更新5条数据,1小时大约更新300条数据,一天工作12小时,可以更新3600条数据。这样的话,工作量只有1/3,所以只需要发800/3的工资给他就够了,也就是266.67/月。

相对于请一个懂得编程的人员来说,这个是一个比较靠谱的方案,一节省了程序员的开支,二开拓了农民工就业方向,三是有效降低失业率,四还可以申请国家高新技术开发基金。

爱编程的大叔 | 园豆:30839 (高人七级) | 2014-09-17 14:32

要更新的都是以前的就数据,大概几十万条吧,唉,现在都不知道怎么更新好

支持(0) 反对(0) 最长的路漫漫 | 园豆:252 (菜鸟二级) | 2014-09-17 14:37

@最长的路漫漫: 才十几万条啊,这样多没有挑战性。

一条按5毛计算的话,还不到10万,这让领导怎么去向上级申请维护经费呢?

这么重要的事情,完全可以开个标,公开向社会招标,最后中标价8万。

交税2万,领导得3万,还有3万,你拿出100,复印1000份题目,

到蓝翔技术学校计算机班当成考卷发下去,随便找个答案试试,说不定能用,

这样你还能赚2.9万。不行,这样领导会有意见的,再多给领导1、2万。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30839 (高人七级) | 2014-09-17 14:48

@爱编程的大叔: 有没有比较效率一点的思路?

支持(0) 反对(0) 最长的路漫漫 | 园豆:252 (菜鸟二级) | 2014-09-17 14:52

@最长的路漫漫: 如果新值及ID是在另外一个数据库中或是数据表中的话,更新几十万条不过就是几分钟之类的事情。一句SQL语句就搞定了。

如果新值与ID取得的比较麻烦的话,通过编程来进行UPDATE。

代码书写不超过20分钟,执行应该也不会超过几个小时。

不清楚这种事情有啥好问的?反正只是一次性的事情,又不需要UI,又不需要

性能,再慢的服务器最多跑个三五天也就完成更新了。

你这样提问题,没有人知道你的痛点在哪儿?唯一可以怀疑的就是你的编程能力了?

 

所以只能以为你想为国家的GDP增长贡献一分微薄之力了。

你看我上面的方案多好,税收增加了,GDP也增加了,领导也高兴了,你也得利了,四个现代化也快实现了。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30839 (高人七级) | 2014-09-17 15:01

@爱编程的大叔:赞一个~写得太棒了~

支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2014-09-17 15:32

@爱编程的大叔: 刚刚问题没有描述清楚,我把问题补充了一下

支持(0) 反对(0) 最长的路漫漫 | 园豆:252 (菜鸟二级) | 2014-09-17 15:53

@最长的路漫漫: 你不会写代码是吗?

sub updateCode()

  dim query = from c in DBContext.table

 

  for each item in query

    dim newValue as string=GetNewValue(item.ResID)

    

    item.ResCode=newValue

 

    dbContext.Submitchange

  next 

end sub 

 

private function GetNewValue(byval resID as integer) as string

    ...

end function

以上代码不收费,不要感谢我,我是雷锋...

支持(0) 反对(0) 爱编程的大叔 | 园豆:30839 (高人七级) | 2014-09-17 15:58

看来真是两耳不闻窗外事,一心只懂写代码,就算2014年吧,去看看外面农民工多少钱再说吧,到时候别让大多数程序员自卑就好

支持(0) 反对(0) 百谷 | 园豆:200 (初学一级) | 2015-10-20 13:22
0

大叔真是口水哥啊,一下能说这么多,口材不错。

关于解决方案我觉得你这个要是是一次性的只能写个SQL脚本执行一下完事。

弄个游标遍历更新一下。

Alex_QY1987 | 园豆:1888 (小虾三级) | 2014-09-17 15:24

不是一次性的,这是要集成到一个服务里面,隔一段时间跑一次

支持(0) 反对(0) 最长的路漫漫 | 园豆:252 (菜鸟二级) | 2014-09-17 15:54

@最长的路漫漫: 那就把这段脚本写成存储过程,在程序里去调用这个存储过程就O了

支持(0) 反对(0) Alex_QY1987 | 园豆:1888 (小虾三级) | 2014-09-17 16:03
0

把数据先从excel文件导入到数据库的一个临时表b里。

然后update 原来的表a - update a.ResCode = b.ResCode from a join b on a.ResID = b.ResID

最后把b delete了。  挺简单的吧。

gunsmoke | 园豆:3592 (老鸟四级) | 2014-09-19 12:09
0

为什么我觉得很简单的,这样实现不了?

  写一个定时程序,调用存储过程,几千条数据,循环执行

  update  tableA set Rescode=newRescode where tableA.ResID=newtableA.ResID

额外最多考虑下执行时间间隔果断,会引起sql锁定

风醉 | 园豆:1197 (小虾三级) | 2014-09-22 14:56
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册