SQL Server:无休止的 WHILE EXISTS 循环
Posted
技术标签:
【中文标题】SQL Server:无休止的 WHILE EXISTS 循环【英文标题】:SQL Server: Endless WHILE EXISTS loop 【发布时间】:2011-11-29 17:58:25 【问题描述】:我对以下 WHILE EXISTS 循环有疑问。您能否考虑一下为什么它是无限循环以及为什么它不更新值?
declare @part varchar(20)
while exists ((select top 1 * from part1 p where isnull(brojRacuna,'')=''))
begin
set @part=''
set @part=(select top 1 partija from part1 p where isnull(brojRacuna,'')='')
begin tran
update part1
set BrojRacuna= (select dbo.dev_brojracuna (@part))
where partija like @part
print @part
commit
end
编辑 1: 因为我一开始没有找到解决方案,所以我以这种方式创建了光标并更新了数据。之后我发现剩下的几行没有更新,因为函数存在数据问题并且无法更新该行的值。在这种情况下,字段始终为空,循环变得无穷无尽。
【问题讨论】:
你为“exists()”编写的代码在哪里 我不明白你为什么在存在语句中需要“isnull(brojRacuna,'')=''”。 我不小心留下了一部分代码:'and partija='1111' ' 我们这里不需要它,因为我想更新所有 BrojRacuna 为 NULL 的行。 【参考方案1】:我不明白你为什么选择partija值,因为你在where子句中有它,你可以这样简化很多:
declare @part varchar(20)
while exists ((select 1 from part1 p where isnull(brojRacuna,'')='' and partija='1111'))
begin
begin tran
update part1
set BrojRacuna= (select dbo.dev_brojracuna ('1111'))
where partija like '1111'
commit
end
顺便说一句,如果你有一个无限循环,也许函数 dev_brojracuna 没有返回正确的值,而 brojRacuna 保持不变。
【讨论】:
正如我在评论中对我的问题所说的那样:我不小心留下了一部分代码:'and partija='1111'' 我们在这里不需要它,因为我想更新 BrojRacuna 所在的所有行为 NULL。 好吧,我发帖的时候没有那个评论 :) 无论如何,你检查过 brojRacuna 函数了吗? 当然,我宣布评论只是以防你没有看到它。 ;-) 你可以看看 EDIT1,里面有写关于函数的。感谢您的回答和建议!以上是关于SQL Server:无休止的 WHILE EXISTS 循环的主要内容,如果未能解决你的问题,请参考以下文章