重置@@ FETCH_STATUS存储过程

时间:2008-10-04 15:40:57

标签: sql sql-server sql-server-2005 stored-procedures cursor

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

另外,你可以将FETCH_STATUS绑定到特定的游标吗?

9 个答案:

答案 0 :(得分:2)

我能够重现您描述的@@FETCH_STATUS问题,这是您DECLARE CURSOR后的问题,并通过调用FETCH NEXT来遍历行,直到您{{1} }}。
然后,即使您@@FETCH_STATUS = -1CLOSE光标,如果您将DEALLOCATE称为CURSOR,并且如果您的@@FETCH_STATUS = -1基础上存在循环条件,那么循环从不执行。

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

这是一个例子。我使用了orderitems中的三列(人们下订单的项目)来创建我的光标:

CURSOR

结果如下:

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;

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

答案 1 :(得分:1)

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

答案 2 :(得分: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

答案 3 :(得分:1)

我知道的一个老线程,但在其他地方发现的对我有用的答案是:

WHILE (1 = 1) 
BEGIN
    FETCH NEXT FROM mycursor INTO @somevar
    IF (@@FETCH_STATUS <> 0) BREAK
    -- do stuff here
END

答案 4 :(得分:0)

你不能:

  

@@ FETCH_STATUS(Transact-SQL)

     

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

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

答案 5 :(得分:0)

正如Sklivvz所写,你做不到。

但我想知道您为什么要重置它?

真正的问题是什么?

答案 6 :(得分:0)

通常在FETCH之后你有一个@@ FETCH_STATUS ,所以你为什么要重置它?

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

答案 7 :(得分:0)

如果您想要中断光标您可以使用BREAK
但这只能将函数从0替换为1。

fetch next
While @@fetch_Status = 0
begin

if (my condition)
 break
fetch next ;

end 

答案 8 :(得分:0)

我认为需要重置光标。 我正在使用游标进行一些测试,即使在我对正在测试的游标进行编码关闭和释放后,我仍然会以@@ fetch_status = -1返回。

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

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

关闭游标,释放游标。