【发布时间】:2014-08-20 07:15:47
【问题描述】:
我使用以下代码计算帐单,但是当我的记录变成 100k 时,我的应用返回超时错误,请告诉我如何重写它以提高性能???
注意: 我有借记和贷记记录,我的结果是 BALANCE 和 STATUS 。
declare @lbalance decimal=0 , @credit decimal=0 , @debit decimal=0 , @new_balance decimal=0,@balance decimal=0
DECLARE q1_cursor CURSOR DYNAMIC for select debit,credit,balance,[status] from #t1
open q1_cursor
fetch next from q1_cursor into @debit,@credit,@lbalance,@st
while @@fetch_status=0
begin
set @new_balance=@new_balance+isnull(@credit,0)-isnull(@debit,0)
if(@new_balance>1)
begin
set @st='creditor'
set @balance=@new_balance
end
else
begin
set @st='debtor'
set @balance=@new_balance*-1
end
update #t1 set balance=@balance,[status]=@st where current of q1_cursor
fetch next from q1_cursor into @debit,@credit,@lbalance,@st
end
close q1_cursor
deallocate q1_cursor
select * from #t1
编辑:
我像下面这样重写你的代码,但是,我得到了错误! “递归查询“HierarchicalCTE”的“余额”列中的锚点和递归部分之间的类型不匹配。”我该怎么办??
with HierarchicalCTE (ID,Date, Debit, Credit, Balance, [Status]) As
(
select ID,Date, Debit, Credit, Balance, [Status]
from #t1
where ID = 1
union all
select tbl.ID,tbl.Date, tbl.Debit, tbl.Credit
, Balance=(case when ((tbl.Debit > 0 and cte.[Status] = 'debtor') or (tbl.Credit > 0 and cte.[Status] = 'creditor')) then abs(cte.Balance + tbl.Debit)
when tbl.Debit > 0 and cte.[Status] = 'creditor' then abs(cte.Balance - tbl.Debit)
else abs(cte.Balance - tbl.Credit)
end)
, cast(case when ((tbl.Debit > 0 and cte.[Status] = 'debtor') or (tbl.Debit > 0 and tbl.Debit > cte.Balance)) then 'debtor'
else 'creditor'
end as char(20)) as [Status]
from #t1 tbl
inner join HierarchicalCTE cte
on tbl.ID = cte.ID+1
)
select * from HierarchicalCTE
【问题讨论】:
-
我认为您根本不需要光标。能否提供一些数据和预期结果?
-
@deterministicFail 我已经在帖子中添加了一些信息,请检查一下
-
游标无法处理 10 万条记录,而不是游标使用表值函数。
-
@Dineshalla 在帮助我解决这个问题之前没有使用任何表值函数
标签: sql-server-2008 query-performance accounting sqlperformance