2012-05-10 13 views
0
declare @i int 
declare @skool float 

declare schoolCursor cursor for 
select distinct choice from tempstuas 

open schoolCursor 
fetch next from schoolCursor into @skool 
while @@fetch_status = 0 
begin 
     while @i < 20 
      begin 
       update top(1) tempstuas set [email protected] where cnt = '' and cat = 1 and [email protected] 
       update top(1) tempstuas set [email protected] where cnt = '' and cat = 2 and [email protected] 
       update top(1) tempstuas set [email protected] where cnt = '' and cat=3 and [email protected] 

       set @i = @i + 1 
      end 
     fetch next from schoolCursor 
end 
close schoolCursor 
deallocate schoolCursor 

이것은 기본적으로 개별 위치 번호를 반환하는 커서를 통해 진행됩니다. 위치 번호는 특정 시간 (20)을 반복하는 while 루프 내에서 사용해야하는 커서의 변수로 저장됩니다. 반환되는 것은 위치 번호의 전체 목록에 대해 커서를 이동하는 것 뿐이며 while 루프를 통해 update 문을 반복하지는 않습니다.A While 루프 while 루프 while 루프 - SQL

+2

1)이 시험을 볼 수 없습니다 < (20)

입니다. 'WHILE' 명령문 바로 앞에'SET @i = 1' (또는 0 또는 필요한 것)을 넣으시겠습니까? 2). 커서 및 While 루프를 사용하지 않고이를 수행 할 수있는 방법을 찾아보십시오. – MatBailie

답변

2

커서를 사용하면 문제를 해결하는 데 일반적으로 잘못된 방법이므로 세트 기반 솔루션을 제안하기 위해 현재 무엇을하고 있는지 파악할 시간이 없습니다.하지만 세트에서 생각하기 시작해야합니다. 사고 고리를 멈추십시오. 문제는 @i가 null이다 그러나

는, null가 내 이론

declare @i int 

if @i<20 print'hi' 
else print 'bye' 
+0

HLGEM이 켜져 있습니다. i 변수를 초기화하십시오. 그러나 행 접근 (RBAR)을 고민함으로써 행에서 벗어나 시도해야합니다. 커서는 종종 성능 저하 요인입니다. – Namphibian

+0

i, i = 0을 초기화하면이 작업을 반복 할 수 있습니다. 이론이나 링크를 설정하기위한 권장 사항이 있습니까? 도움과 빠른 응답에 감사드립니다. – central

+0

여기에 시작 장소가 있습니다. http://wiki.lessthandot.com/index.php/Cursors_and_How_to_Avoid_Them – HLGEM