2011-10-03 3 views
4

WHILE EXISTS 루프에 문제가 있습니다. 왜 그것이 무한 반복이고 왜 값을 업데이트하지 않는지 이유가 무엇인지 생각해 볼 수 있습니까?SQL Server : 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

exist 문에 "isnull (brojRacuna, '') = ''"가 필요한 이유를 모르겠습니다. – 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을 살펴볼 수 있습니다, 거기에 기능에 대해 작성된 것입니다. 답변과 제안에 감사드립니다! –

관련 문제