2013-07-25 12 views
12

W języku C# używamy instrukcji continue w pętli, aby przejść do następnej iteracji. Ale używając Cursora w TSQL, jak mogę wykonać to samo. Powiedzmy, że mam,Kontynuuj od góry w SQL SERVER Cursor?

DECLARE db_cursor CURSOR FOR SELECT age, name, color FROM table; 
DECLARE @myName VARCHAR(256); 
DECLARE @myAge INT; 
DECLARE @myFavoriteColor VARCHAR(40); 
OPEN db_cursor; 
FETCH NEXT FROM db_cursor INTO @myName, @myAge, @myFavoriteColor; 
WHILE @@FETCH_STATUS = 0 
BEGIN 
     --Do stuff 
     IF @myAge=1 
     BEGIN 
      -- Use continue here 
     END  
     --Do stuff 


     FETCH NEXT FROM db_cursor INTO @myName, @myAge, @myFavoriteColor; 
END; 
CLOSE db_cursor; 
DEALLOCATE db_cursor; 
+0

Oczywiście zdajesz sobie sprawę, że jest złą praktyką użycie kursorów, czy istnieje sposób, zestaw opartych wykonać zadanie, prawda? Kursory są zabójcami wydajności. – HLGEM

Odpowiedz

27

CONTINUE ma wrócić do początku pętli WHILE, ale to nie jest dokładnie tak, jak w języku C#, ponieważ kursor pętli idiom w T -SQL jest podzielony na dwa oddzielne sprawozdania, a WHILE to drugi z nich - najczystsze, wymagający najmniej powtórzenia może być nasz stary znajomy GOTO:

DECLARE db_cursor CURSOR FOR SELECT age, name, color FROM table; 
DECLARE @myName VARCHAR(256); 
DECLARE @myAge INT; 
DECLARE @myFavoriteColor VARCHAR(40); 
OPEN db_cursor; 
FETCH NEXT FROM db_cursor INTO @myName, @myAge, @myFavoriteColor; 
WHILE @@FETCH_STATUS = 0 
BEGIN 
     --Do stuff 
     IF @myAge=1 
     BEGIN 
      Goto Cont 
     END  
     --Do stuff 

Cont: 
     FETCH NEXT FROM db_cursor INTO @myName, @myAge, @myFavoriteColor; 
END; 
CLOSE db_cursor; 
DEALLOCATE db_cursor; 
+0

O, ten też wygląda świetnie. Dzięki. – user960567

3

Spróbuj ten -

DECLARE 
     @myName VARCHAR(256) 
    , @myAge INT 
    , @myFavoriteColor VARCHAR(40) 

DECLARE cursor_name CURSOR FAST_FORWARD READ_ONLY FOR 
    SELECT age, name, color 
    FROM [table] 

OPEN db_cursor 

FETCH NEXT FROM db_cursor INTO 
     @myName 
    , @myAge 
    , @myFavoriteColor 

WHILE @@FETCH_STATUS = 0 BEGIN 

     IF @myAge = 1 BEGIN 

      FETCH NEXT FROM db_cursor INTO 
        @myName 
       , @myAge 
       , @myFavoriteColor 

     END  

     FETCH NEXT FROM db_cursor INTO 
      @myName 
      , @myAge 
      , @myFavoriteColor 

END 

CLOSE db_cursor 
DEALLOCATE db_cursor 
+0

Myślę, że KONTYNUACJA nie przechodzi do następnej iteracji w przeciwieństwie do C# – user960567

+0

@ user960567 - tutaj znajduje się [strona Technet] (http://technet.microsoft.com/en-us/library/ms174366.aspx). –

+0

@ user960567 proszę zobaczyć zaktualizowaną odpowiedź. – Devart

6

można użyć Kontynuuj w ten sposób

DECLARE db_cursor CURSOR FOR SELECT age, name, color FROM table; 
DECLARE @myName VARCHAR(256); 
DECLARE @myAge INT; 
DECLARE @myFavoriteColor VARCHAR(40); 
OPEN db_cursor; 
FETCH NEXT FROM db_cursor INTO @myName, @myAge, @myFavoriteColor; 
WHILE @@FETCH_STATUS = 0 
BEGIN 
     --Do stuff 
     IF @myAge=1 
     BEGIN 

      FETCH NEXT FROM db_cursor INTO @myName, @myAge, @myFavoriteColor; 
      CONTINUE; 
     END  
     --Do stuff 


     FETCH NEXT FROM db_cursor INTO @myName, @myAge, @myFavoriteColor; 
END; 
CLOSE db_cursor; 
DEALLOCATE db_cursor;