在存储过程中处理多个游标

时间:2012-03-06 11:13:02

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

我在存储过程中有两个游标(比如CRSX1,CRSX2)。它就像我需要实现的嵌套while循环逻辑。我可以在CRSX1打开时使用第二个光标CRSX2,还是在使用第二个光标之前必须关闭第一个光标。

如果我们必须在SQL Server中实现double while循环的逻辑

,还有其他方法吗?

提前致谢

3 个答案:

答案 0 :(得分:2)

您可以嵌套游标,但是如果可以的话,您应该寻找删除这些游标以支持基于SET的操作。否则,性能可能不会很好,尤其是在数据量较大的情况下。我只使用游标/循环作为最后的手段。

进一步说明:
使用游标意味着您将逐行迭代以执行特定操作(RBAR - 行按Agonizing Row)。这不如一次性(即基于集合)在一组数据上以单一的非循环方式执行操作那样有效。

e.g。一个粗略的例子,用于计算表中的行数。

选项1:令人讨厌的RBAR方式,在表格上打开一个光标,循环并增加一个计数器变量。

选项2:令人敬畏的基于集合的方法,运行单个SELECT,例如:SELECT COUNT(*) FROM YourTable

所以我的意思是,尝试重构SQL以找到基于集合的方法来实现您想要的结果。通常很少有时候循环/光标方法不能被基于集合的方法取代。

答案 1 :(得分:2)

正如您在Using nested cursors to produce report output microsoft example中所看到的,您可以使用嵌套游标。

示例vendor_cursor包含product_cursor

答案 2 :(得分:1)

您可以使用嵌套游标,但需要在外部游标的WHILE循环内声明/ open / fetch / close / deallocate内部游标。