Подтвердить что ты не робот

Продолжить сверху в SQL SERVER Cursor?

В языке С# мы используем оператор continue в цикле для перехода к следующей итерации. Но используя Cursor в TSQL, как я могу выполнить то же самое. Скажем, у меня есть

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;
4b9b3361

Ответ 1

CONTINUE возвращается к началу цикла WHILE, но это не совсем так, как в С#, так как идиома курсора в T-SQL разбита на два отдельных оператора, а WHILE - это второй из них - самый чистый, требующий наименьшего повторения, может быть нашим старым другом 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;

Ответ 2

вы можете использовать CONTINUE таким образом

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;

Ответ 3

Попробуйте этот вариант -

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