0

如何@@FETCH_STATUS在存储过程中重置变量或将其设置为 0?

此外,您可以将 FETCH_STATUS 绑定到特定游标吗?

4

8 回答 8

3

我能够重现@@FETCH_STATUS您描述的问题,这是一次您DECLAREaCURSOR并通过调用FETCH NEXT直到您的@@FETCH_STATUS = -1.
然后,即使您CLOSEDEALLOCATE您的光标,如果您将其CURSOR回调@@FETCH_STATUS = -1,并且如果您基于 的循环条件@@FETCH_STATUS <> -1,您的循环也永远不会执行。

我的解决方案是基本上告诉CURSOR返回到FIRST,将@@FETCH_STATUS返回更改为0,然后退出。请注意,当您声明它时,必须通过在名称后CURSOR添加关键字来启用滚动。SCROLLCURSOR

这是一个例子。我使用了 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

光标可以反复运行,每次都会产生相同的结果。

于 2014-06-05T05:43:40.600 回答
1

您可以通过读取不在表格末尾的游标来重置它。

于 2008-10-04T15:44:59.153 回答
1

您需要关闭游标,然后再次打开游标。

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
于 2011-09-14T03:42:26.327 回答
1

我知道一个旧线程,但在其他地方找到的对我有用的答案是:

WHILE (1 = 1) 
BEGIN
    FETCH NEXT FROM mycursor INTO @somevar
    IF (@@FETCH_STATUS <> 0) BREAK
    -- do stuff here
END
于 2015-10-15T18:44:41.960 回答
0

你不能:

@@FETCH_STATUS (Transact-SQL)

返回针对连接当前打开的任何游标发出的最后一个游标FETCH 语句的状态。

所以基本上它没有绑定到任何游标。

于 2008-10-04T16:04:31.563 回答
0

通常,您在 FETCH 之后立即有一个 @@FETCH_STATUS ,那么您为什么要重置它呢?

如果您不立即评估,请尝试将其结果存储在临时变量中。

于 2008-10-07T22:40:01.293 回答
0

我认为需要重置光标。我正在使用游标进行一些测试,并且我一直返回 @@fetch_status = -1,即使在我编写了关闭和释放到我正在测试的游标的代码之后。

发生的事情是我在逻辑测试后在另一个过程中打开了一个全局游标,并且在遍历它之后从未关闭过该游标。

所以 Fetch 看到了那个游标的@@Fetch_status。

关闭你的游标,释放你的游标。

于 2014-01-16T17:57:16.373 回答
0

如果你想打破光标你可以使用BREAK
但这只是将函数从 0 替换为 1。

fetch next
While @@fetch_Status = 0
begin

if (my condition)
 break
fetch next ;

end 
于 2010-10-11T14:22:43.720 回答