有个表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.来修改,好像效率也不高。
问下大家,有没有更好的方法...效率能高一点点...?
客户端使用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.来修改,好像效率也不高。
问下大家,有没有更好的方法...效率能高一点点...?
解决方案 »
- identity(1,1)如何设置可插入
- 系统存储过程返回值如何得到??我怎么老不成功呢??
- SQL 大神快现身,帮小弟看一个SQL的问题
- 救急
- 小弟新学sql,两个初级问题请教大家
- 我做了一个insert触发器,当记录不符合要求时rollback,我现在想在程序里面感知rollback,否则我就不知道是否插入成功啊,该怎么办呢?
- 数据导入、导出的问题,走来路过进来看看,谢了!
- 请问一个关于sqlserver7绑定后数据显示不正确的问题
- 请问怎样用SQL语言判断一个datetime类型数据对应的是星期几?
- 用SQL查询多张表的问题。
- 关于 mysql安装后无法启动的问题
- 求高手指点一SQL算法
无论怎sql写得怎么短,最终数据库update还是在一个事务里一条一条做的,我们能够省下来的是通信(程序送sql语句)的时间和解析sql语句的时间。用第三种方法,并且给临时表也加个索引。目前想不出更快的了。
update tbA set fValue=表.fValue where tbA.fId=表.fId.来修改,好像效率也不高。这个应该会好点!
方法1:把List拼接成一个XML,写个存储过程将XML导入临时表后,金额一做任何处理。
方法2:如果2008+,可以考虑表值参数,具体用法可能要看看2008和.net的说明
--直接用,分隔呢?到时可以直接当个集合放到括号里用in?
update tbA set fValue=表.fValue where tbA.fId in (...)
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)