我在存储过程中有两个游标(比如CRSX1,CRSX2)。它就像我需要实现的嵌套while循环逻辑。我可以在CRSX1打开时使用第二个光标CRSX2,还是在使用第二个光标之前必须关闭第一个光标。
如果我们必须在SQL Server中实现double while循环的逻辑
,还有其他方法吗?提前致谢
答案 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内部游标。