是否必须关闭 T-SQL 存储过程中的游标?

pun*_*lly 2 sql-server stored-procedures

我们在 PayPal 订单方面遇到了间歇性问题,我一直在深入研究我们的代码。我们在特定存储过程中收到一个异常,显示“等待操作超时”。在存储过程中,我可以看到一个名为的游标item_cursor被声明并随后打开,但它从未关闭。存储过程直接结束,无需调用close item_cursor(或DEALLOCATE item_cursor)。

我是前端开发人员而不是后端开发人员,所以我有点超出我的深度,但这会导致问题吗?

Dam*_*ver 5

这取决于游标的声明方式:

当地的

指定游标的范围是创建游标的批处理、存储过程或触发器的本地范围。游标名称仅在此范围内有效。...当批处理、存储过程或触发器终止时,游标将隐式释放,除非游标在 OUTPUT 参数中传回。如果它在 OUTPUT 参数中传回,则当引用它的最后一个变量被释放或超出范围时,游标将被释放。

全球的

指定游标的范围对于连接是全局的。可以在连接执行的任何存储过程或批处理中引用游标名称。游标仅在断开连接时隐式释放

(我的重点

然后,它继续解释如果两者都没有指定,它如何选择默认值,但是如果您没有更改系统上的任何其他内容,则它将是GLOBAL默认值,在这种情况下意味着,是的,它将“泄漏” 。如果光标持有任何锁,它将继续持有这些锁,直到连接断开。