如何@@FETCH_STATUS
在存储过程中重置变量或将其设置为 0?
此外,您可以将 FETCH_STATUS 绑定到特定游标吗?
如何@@FETCH_STATUS
在存储过程中重置变量或将其设置为 0?
此外,您可以将 FETCH_STATUS 绑定到特定游标吗?
我能够重现@@FETCH_STATUS
您描述的问题,这是一次您DECLARE
aCURSOR
并通过调用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
光标可以反复运行,每次都会产生相同的结果。
您可以通过读取不在表格末尾的游标来重置它。
您需要关闭游标,然后再次打开游标。
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
我知道一个旧线程,但在其他地方找到的对我有用的答案是:
WHILE (1 = 1)
BEGIN
FETCH NEXT FROM mycursor INTO @somevar
IF (@@FETCH_STATUS <> 0) BREAK
-- do stuff here
END
你不能:
@@FETCH_STATUS (Transact-SQL)
返回针对连接当前打开的任何游标发出的最后一个游标FETCH 语句的状态。
所以基本上它没有绑定到任何游标。
通常,您在 FETCH 之后立即有一个 @@FETCH_STATUS ,那么您为什么要重置它呢?
如果您不立即评估,请尝试将其结果存储在临时变量中。
我认为需要重置光标。我正在使用游标进行一些测试,并且我一直返回 @@fetch_status = -1,即使在我编写了关闭和释放到我正在测试的游标的代码之后。
发生的事情是我在逻辑测试后在另一个过程中打开了一个全局游标,并且在遍历它之后从未关闭过该游标。
所以 Fetch 看到了那个游标的@@Fetch_status。
关闭你的游标,释放你的游标。
如果你想打破光标你可以使用BREAK
但这只是将函数从 0 替换为 1。
fetch next
While @@fetch_Status = 0
begin
if (my condition)
break
fetch next ;
end