SQL 怎么一次性修改多条数据

shop98 2011-08-16 12:16:15
有个表tbA,有二列fId,fValue
客户端使用List<string>传来要修改条数据的fId与fValue值,如a1`v1 a3`v3 ...使用`为分隔符。
我使用C#.net的,这里解释下List<string>就是一个字符串的数组,其中a1`v1就是这个数组a[0]的值。
现在把数组分解后 a[i].split('`'),根据fId=a1,来修改fValue=v1,有多条数据一次性修改。
要考虑效率..
第一种方法:把List<string>分解后,用个循环逐条修改,效率太低,不做考虑。
第二种方法:分解后,用循环把所有的update拼起来,字符串太长...,也是逐条的另种写法
第三种方法:临时建个表,把List<stirng>的数据插入这表中,再利用
update tbA set fValue=表.fValue where tbA.fId=表.fId.来修改,好像效率也不高。
问下大家,有没有更好的方法...效率能高一点点...?
...全文
6266 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
勿勿 2011-08-16
  • 打赏
  • 举报
回复
没发现有什么办法,帮顶!
shop98 2011-08-16
  • 打赏
  • 举报
回复
刚才使用表变量弄了实现了第三种方法,贴出来给大家看下,看看大家还有没有更好的办法
declare @tbB table
(
tmpId bigint,
tmpValue nvarchar(50)
)
insert into @tbB(tmpId ,tmpValue)
select 1300011722319589700,'V4'
UNION
select 1300011722357784750,'V5'
UNION
select 1300011723002904009,'V6'

Update tbA
set fValue=(select tmpValue from @tbB B where fId=B.tmpId )
where fId in (1300011722319589700,1300011722357784750,1300011723002904009)
NBDBA 2011-08-16
  • 打赏
  • 举报
回复
其他方法:
方法1:把List拼接成一个XML,写个存储过程将XML导入临时表后,金额一做任何处理。
方法2:如果2008+,可以考虑表值参数,具体用法可能要看看2008和.net的说明
chuanzhang5687 2011-08-16
  • 打赏
  • 举报
回复
第三种方法:临时建个表,把List<stirng>的数据插入这表中,再利用
update tbA set fValue=表.fValue where tbA.fId=表.fId.来修改,好像效率也不高。

这个应该会好点!
快溜 2011-08-16
  • 打赏
  • 举报
回复
你这个批量修改,也没什么规律,用临时表绕远了,还不如第二种方法,直接拼接起来更新,如果有五条更新语句,第一条会慢一点,后面几条数据库缓存应该会快一点。
shop98 2011-08-16
  • 打赏
  • 举报
回复
自已顶一下,在线,急等
cosmo_sei 2011-08-16
  • 打赏
  • 举报
回复
第三种方法慢应该慢在insert临时表上了吧,还有临时表没有索引也会慢一些。
无论怎sql写得怎么短,最终数据库update还是在一个事务里一条一条做的,我们能够省下来的是通信(程序送sql语句)的时间和解析sql语句的时间。

用第三种方法,并且给临时表也加个索引。目前想不出更快的了。
geniuswjt 2011-08-16
  • 打赏
  • 举报
回复

--直接用,分隔呢?到时可以直接当个集合放到括号里用in?
update tbA set fValue=表.fValue where tbA.fId in (...)
--小F-- 2011-08-16
  • 打赏
  • 举报
回复
XML的效率一样不高 还是建议用临时表

22,302

社区成员

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

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