2011-10-03 74 views
4

我有以下WHILE EXISTS循环的问题。你能否考虑一下为什么它是无限循环以及它为什么不更新值?SQL Server:无尽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:因为我没有找到在第一时刻的解决方案,我以这种方式创建光标和更新的数据。之后,我发现左边的行没有更新,因为函数有数据问题,无法更新该行的值。在那种情况下,字段总是空的,循环变得无止境。

+0

其中是你写的代码“exists()” –

+0

我不明白你为什么需要“isnull(brojRacuna,'')=''”在exists语句中。 – bksi

+0

我不小心遗留了一部分代码:'and partija ='1111''我们不需要它,因为我想更新BrojRacuna为NULL的所有行。 –

回答

4

我不明白你为什么选择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保持不变。

+0

正如我在评论中说的我的问题:我不小心留下了一部分代码:'and partija ='1111''我们不需要它,因为我想更新BrojRacuna为NULL的所有行。 –

+0

好的,当我发布的时候没有那个评论:)无论如何,你有没有检查过brojRacuna函数? – Dippi

+0

当然,我只是在你没有看到它的情况下才发表评论。 ;-)你可以看看EDIT1,有关于函数的文章。感谢您的回答和建议! –