Я могу воспроизвести проблему @@FETCH_STATUS
, которую вы описываете, на этот раз вы DECLARE
a CURSOR
и выполняете итерацию по строкам, вызывая FETCH NEXT
до тех пор, пока @@FETCH_STATUS = -1
.
Тогда, даже если вы CLOSE
и DEALLOCATE
используете курсор, если вы вызываете этот CURSOR
обратно для @@FETCH_STATUS = -1
и если вы основываете условие цикла на @@FETCH_STATUS <> -1
, ваш цикл никогда не будет выполнен.
Мое решение состояло в том, чтобы в основном сказать CURSOR
вернуться к FIRST
, изменить @@FETCH_STATUS
обратно на 0
, а затем выйти. Обратите внимание, что необходимо включить прокрутку CURSOR
, добавив ключевое слово SCROLL
после имени CURSOR
при его объявлении.
Вот пример. Для создания курсора я использовал три столбца из таблицы orderitems (элементы, на которые люди размещали заказы):
USE transact_Sales;
GO
DECLARE @isOrderNumber INT;
DECLARE @isOrderTotal MONEY;
DECLARE test SCROLL CURSOR
FOR
SELECT Oi.order_num, SUM(Oi.quantity@item_price) FROM orderitems AS Oi GROUP BY order_num;
OPEN test;
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM test INTO @isOrderNumber, @isOrderTotal
PRINT CAST(@isOrderNumber AS VARCHAR(20)) + ' '
+CAST(@isOrderTotal AS VARCHAR(20)) + ' '
+CAST(@@FETCH_STATUS AS VARCHAR(5))
END
FETCH FIRST FROM test INTO @isOrderNumber, @isOrderTotal
CLOSE test;
DEALLOCATE test;
Вот результаты:
20005 149.87 0
20006 55.00 0
20007 1000.00 0
20008 125.00 0
20009 38.47 0
20009 38.47 -1
Курсор можно запускать снова и снова, и каждый раз он будет выдавать одни и те же результаты.