Сбросить @@ FETCH_STATUS хранимую процедуру - PullRequest
0 голосов
/ 04 октября 2008

Как я могу сбросить переменную @@ FETCH_STATUS или установить ее в 0 в хранимой процедуре?

Также, вы можете привязать FETCH_STATUS к определенному курсору?

Ответы [ 9 ]

2 голосов
/ 05 июня 2014

Я могу воспроизвести проблему @@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

Курсор можно запускать снова и снова, и каждый раз он будет выдавать одни и те же результаты.

1 голос
/ 15 октября 2015

Старая ветка, которую я знаю, но ответ, найденный в другом месте, который работал для меня, был:

WHILE (1 = 1) 
BEGIN
    FETCH NEXT FROM mycursor INTO @somevar
    IF (@@FETCH_STATUS <> 0) BREAK
    -- do stuff here
END
1 голос
/ 14 сентября 2011

Вам нужно закрыть курсор, а затем снова открыть курсор.

DECLARE @IDs int
DECLARE MyCursor CURSOR FOR(SELECT ID FROM Table)
OPEN MyCursor
FETCH NEXT FROM MyCursor INTO @IDs
WHILE @@FETCH_STATUS=0
BEGIN
    --Do your work(First loop)
FETCH NEXT FROM MyCursor INTO @IDs
END
CLOSE MyCursor
--Run the cursor again
OPEN MyCursor
FETCH NEXT FROM MyCursorINTO @IDs
WHILE @@FETCH_STATUS=0
BEGIN
    --Other work (Second loop)
    FETCH NEXT FROM MyCursor INTO @IDs
END
CLOSE MyCursor
DEALLOCATE MyCursor
1 голос
/ 04 октября 2008

Вы можете сбросить его, прочитав курсор, который находится не в конце таблицы.

0 голосов
/ 16 января 2014

У меня было то, что я считал нужным сбросить курсор. Я проводил некоторое тестирование с курсорами и продолжал возвращаться с @@ fetch_status, равным -1, даже после того, как я закодировал закрытие и освобождение курсора, который я тестировал.

Произошло то, что я открыл глобальный курсор в другой процедуре после логического теста и никогда не закрывал этот курсор после итерации по нему.

Итак, Fetch видел @@ Fetch_status этого курсора.

Закройте свои курсоры, освободите свои курсоры.

0 голосов
/ 11 октября 2010

Если вы хотите сломать курсор, вы можете использовать BREAK
Но это только заменить функцию от 0 до 1.

fetch next
While @@fetch_Status = 0
begin

if (my condition)
 break
fetch next ;

end 
0 голосов
/ 08 октября 2008

Обычно у вас есть @@ FETCH_STATUS сразу после FETCH, так почему вы хотите сбросить его?

Попробуйте сохранить его результат во временной переменной, если вы не оцениваете сразу.

0 голосов
/ 08 октября 2008

Как писал Скливвз, вы не можете.

Но мне интересно, почему вы хотите сбросить его?

В чем реальная проблема?

0 голосов
/ 04 октября 2008

Вы не можете:

@@ FETCH_STATUS (Transact-SQL)

Возвращает статус последнего курсор оператор FETCH выдан против любого курсора , открытого в данный момент по связи.

Так что, по сути, он не связан ни с одним курсором.

...