发布网友 发布时间:2022-04-23 02:40
共1个回答
热心网友 时间:2023-10-12 02:58
首先说明,楼主读取游标的写法是正确规范的写法,效率应该也是最高的,不明白为什么非要只让fetch出现一次。
如果非要这样,可以按这个思路,在定义游标之后,再统计出此游标将会查询出的记录总数,然后定义变量,在循环中使变量增1,超过游标记录总数后,循环中止。具体代码如下:
CREATE PROCEDURE PROC_comp @Now_Date smalldatetime AS
declare @Pre_Sum_Amount numeric(18,2),@Now_Amount numeric(18,2),@Now_Sum_Amount numeric(18,2)
--搜寻前一条记录的累计金额(注意参数top 1及desc,表示倒序排列并取第一条)。
select top 1 @Pre_Sum_Amount=累计金额 from 报表2009
where 日期<@Now_Date and 日期>='2009-10-1' order by 日期 desc
set @Pre_Sum_Amount=isnull(@Pre_Sum_Amount,0)
--建立游标,计算本条记录的累计金额,并依次向后,计算出后续各条记录的累计金额。
declare cur_Accumulate cursor dynamic for
select 金额,累计金额 from 报表2009 where 日期>='2009-10-1' and 日期<='2009-10-31'
declare @t as integer,@n as integer
set @n=1
select @t=count(1) from 报表2009 where 日期>='2009-10-1' and 日期<='2009-10-31'
open cur_Accumulate
while(@n<=@t)
begin
fetch next from cur_Accumulate into @Now_Amount,@Now_Sum_Amount
set @Now_Sum_Amount=@Pre_Sum_Amount+isnull(@Now_Amount,0)
update 报表2009 set 累计金额=@Now_Sum_Amount where current of cur_Accumulate
set @Pre_Sum_Amount=@Now_Sum_Amount
set @n=@n+1
end
close cur_Accumulate
deallocate cur_Accumulate