Продолжить сверху в 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;
Ответы
Ответ 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