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
相关产品推荐
相关产品推荐

