有个表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.来修改,好像效率也不高。
问下大家,有没有更好的方法...效率能高一点点...?

解决方案 »

  1.   

    第三种方法慢应该慢在insert临时表上了吧,还有临时表没有索引也会慢一些。
    无论怎sql写得怎么短,最终数据库update还是在一个事务里一条一条做的,我们能够省下来的是通信(程序送sql语句)的时间和解析sql语句的时间。用第三种方法,并且给临时表也加个索引。目前想不出更快的了。
      

  2.   

    第三种方法:临时建个表,把List<stirng>的数据插入这表中,再利用  
    update tbA set fValue=表.fValue where tbA.fId=表.fId.来修改,好像效率也不高。这个应该会好点!
      

  3.   

    其他方法:
    方法1:把List拼接成一个XML,写个存储过程将XML导入临时表后,金额一做任何处理。
    方法2:如果2008+,可以考虑表值参数,具体用法可能要看看2008和.net的说明
      

  4.   

    XML的效率一样不高 还是建议用临时表
      

  5.   


    --直接用,分隔呢?到时可以直接当个集合放到括号里用in?
    update tbA set fValue=表.fValue where tbA.fId in (...)
      

  6.   

    刚才使用表变量弄了实现了第三种方法,贴出来给大家看下,看看大家还有没有更好的办法
    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)