语句优化,把游标中的更新改成更新语句。

vfork 2008-07-25 09:30:13
declare @BillNo varchar(20)
declare @xh int
declare @OverLevel int --已完成的审批次数
declare @SumLevel int --总共的审批次数
declare @CheckUser varchar(254)
declare my_cur cursor for
select BillNo,xh,SumLevel from #tmp_bill
open my_cur
fetch next from my_cur into @BillNo, @Xh, @SumLevel
while @@fetch_status=0
begin
select @OverLevel=count(1) from CheckRec where Bill='jh' and BillNo=@BillNo and Xh=@xh --计算已经完成的审批次数
select @CheckUser=AppUser from work_flow where Bill='jh' and pLevel=@SumLevel-@OverLevel --当前级别的审核人
update #tmp_bill set OverLevel=@OverLevel, CheckUser=@CheckUser WHERE CURRENT OF my_cur
fetch next from my_cur into @BillNo, @Xh, @SumLevel
end
close my_cur
deallocate my_cur

从表CheckRec中(根据#tmp_bill的BillNo和Xh)取记录条数更新到#tmp_bill表中的OverLevel
从表work_flow中(#tmp_bill的SumLevel和上一步计算出来的OverLevel相减的结果)查找当前级别的审核人,然后更新到#tmp_bill的CheckUser

表#tmp_bill 记录数5000多,表CheckRec记录数5000多,work_flow记录数50多条,
以上游标计算非常慢,想用update语句替换游标,请高手指教。
注:临时表#tmp_bill的BillNo和Xh已经建立索引。
...全文
60 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
vfork 2008-07-25
  • 打赏
  • 举报
回复
牛人真多。谢谢了。
ydage 2008-07-25
  • 打赏
  • 举报
回复
--hery2002的方法就行
update t
set OverLevel=isnull((select count(1) from CheckRec where Bill='jh' and BillNo=t.BillNo and Xh=t.xh),0),
CheckUser=(select AppUser from work_flow where Bill='jh' and
pLevel= SumLevel - (isnull(select count(1) from CheckRec where Bill='jh'
and BillNo=t.BillNo and Xh=t.xh ),0))
from #tmp_bill t
hery2002 2008-07-25
  • 打赏
  • 举报
回复

--try
update t
set OverLevel=isnull((select count(1) from CheckRec where Bill='jh' and BillNo=t.BillNo and Xh=t.xh),0),
CheckUser=(select AppUser from work_flow where Bill='jh' and
pLevel= SumLevel - (isnull(select count(1) from CheckRec where Bill='jh'
and BillNo=t.BillNo and Xh=t.xh ),0))
from #tmp_bill t
wzy_love_sly 2008-07-25
  • 打赏
  • 举报
回复
update t set 
OverLevel=(select count(1) from #tmp_bill where BillNo=t.BillNo and Xh=t.xh),
CheckUser=(select max(AppUser) from work_flow where pLevel=t.SumLevel-t.OverLevel)
from #tmp_bill t
where bill='jh'
vfork 2008-07-25
  • 打赏
  • 举报
回复

declare @BillNo varchar(20)
declare @xh int
declare @OverLevel int --已完成的审批次数
declare @SumLevel int --总共的审批次数
declare @CheckUser varchar(254)
declare my_cur cursor for
select BillNo,xh,SumLevel from #tmp_bill
open my_cur
fetch next from my_cur into @BillNo, @Xh, @SumLevel
while @@fetch_status=0
begin
select @OverLevel=count(1) from CheckRec where Bill='jh' and BillNo=@BillNo and Xh=@xh --计算已经完成的审批次数
select @CheckUser=AppUser from work_flow where Bill='jh' and pLevel=@SumLevel-@OverLevel --当前级别的审核人
update #tmp_bill set OverLevel=@OverLevel, CheckUser=@CheckUser WHERE CURRENT OF my_cur
fetch next from my_cur into @BillNo, @Xh, @SumLevel
end
close my_cur
deallocate my_cur


为了方便查看,贴一下代码格式。

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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