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

时间:2016-12-13 10:37:10

标签: sql-server stored-procedures

PayPal订单出现间歇性问题,我一直在深入研究代码。我们得到一个异常,在特定的存储过程中说“等待操作超时”。在存储过程中,我可以看到声明了一个名为item_cursor的游标,稍后打开但它永远不会关闭。存储过程只是在没有调用close item_cursor(或DEALLOCATE item_cursor)的情况下结束。

我是一个前端开发者而不是后端,所以我有点超出了我的深度,但这可能导致问题吗?

1 个答案:

答案 0 :(得分:4)

这取决于cursor is declared

的方式
  

LOCAL

     

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

     

GLOBAL

     

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

(我强调

然后继续说明如果没有指定默认选项,它会如何选择默认值,但如果您未更改系统中的任何其他内容,默认情况下它将为GLOBAL,在这种情况下意味着那是的,它会"泄漏"。如果光标持有任何锁定,它将继续保持这些锁定,直到您的连接断开连接。