You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL游标无法终止问题排查:新手开发者求助

游标无法终止的问题排查与修复

嘿,我一眼就看到问题所在啦!你的游标陷入死循环的核心原因是**fetch next只在if条件满足时才执行**——如果当前行的dbo.weekcalc(@adat)不等于传入的@kw,程序就不会读取下一行数据,@@FETCH_STATUS会一直保持0,循环就永远停不下来了。

修复后的代码

create procedure testeinsacht 
    @mitid varchar(3), 
    @kw int 
as 
declare cstesteinsacht cursor for 
    select AufDat, KunName, KunOrt, KunPLZ, KunStrasse 
    from auftrag a 
    inner join kunde k on a.KunNr = k.KunNr 
    where MitID is not null and dauer is null and MitID = @mitid 
    order by AufDat 

open cstesteinsacht 
declare @adat date 
declare @kname varchar(30) 
declare @kort varchar(20) 
declare @kplz varchar(5) 
declare @kstrasse varchar(50) 

fetch next from cstesteinsacht into @adat, @kname, @kort, @kplz, @kstrasse 

while (@@FETCH_STATUS = 0) 
begin 
    if (dbo.weekcalc(@adat) = @kw) 
    begin 
        print cast(@adat as varchar(20)) + @kname 
    end 
    -- 关键修改:不管if条件是否满足,都要读取下一行
    fetch next from cstesteinsacht into @adat, @kname, @kort, @kplz, @kstrasse 
end 

close cstesteinsacht 
deallocate cstesteinsacht

修改说明

我把fetch next从if代码块里移到了循环体的末尾,这样不管当前行是否符合打印条件,程序都会尝试读取下一行数据。当游标遍历完所有行后,@@FETCH_STATUS会变成-1,循环就会正常终止啦。

另外给你这个新手提个小建议:写游标时,最好把fetch next放在循环的开头(首次初始化读取)和循环体的末尾(每次循环后读取下一行),这样能从根源上避免这类死循环问题哦~

内容的提问来源于stack exchange,提问作者Detlef7able

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:30:38