declare cur cursor for select ....
open cur
while @@fetch_status=0
begin
if exists(select 1 from tb where id=@id)
begin
update tb set .... where id=@id
end
else
begin
insert tb....
end
fetch next from cur into....
end
close cur
deallocate cur
在长事务里面阻塞了其他查询,请问怎么处理比较好。
语句很复杂的?从这上面的看似乎那个IF可以去掉的。游标是不是也可以去掉?我听朋友说可以用其它办法代替游标的
要先判断是否存在,有就更新,没有就插入,不能去掉,也就是这里更新的时候出现阻塞。
@清海扬波: 那这样的操作,能不能放到程序不忙的时候,去做这样的一个事情
@chenping2008: 就一个UPdate怎么会阻塞,是不是UPdate语句有问题呢?像这样的语句可以改为如下操作,先更新,如果更新的rowcount为0,说明没有更新成功,再进行插入。
update tb set .... where id=@id ;if(@@rowcount==0) begin insert end
@happydaily: 是update把select阻塞了,这是一个长事务,几千条数据是在一个事务里面的
@happydaily: 明天试试你这个方法
@清海扬波: 几千条数据 还是几千条代码啊?如果只有几千条数据对于SQL来说是小意思啊,你最好说出你的业务规则,这样更好帮助你解决,可能是不需要游标的。
@happydaily:
if exists(select 1 from tb where id=@id)
发现瓶颈在这里,在id上面加了聚集索引,马上就快了。但是奇怪的是主键索引是有覆盖这个的,没有走。
@清海扬波: 用我给你的方法直接更新,更新失败再新增