【问题标题】:A cursor with the name ... already exists - SQL Server 2008名称为 ... 的游标已存在 - SQL Server 2008
【发布时间】:2011-10-07 19:42:55
【问题描述】:

我有一个触发器,用于在对表进行更改时执行一些审计任务。在这个触发器中有一个 WHILE 循环,并且在循环中有一个游标,它在循环的下一次迭代之前被声明、使用、关闭然后释放。

当我调用一个更改表并进而导致触发器运行的存储过程,并且我在 Management Studio 中执行此操作时,一切都按预期工作。

但是,当从我的 Java Web 应用程序中调用此存储过程时,我收到错误消息:“名称为 ... 的游标已经存在”。

这个存储过程在我手动执行时会起作用,而从 Web 应用程序运行时不起作用,有什么原因吗?

【问题讨论】:

  • 具有游标和while循环的触发器是需要重构的触发器。

标签: java sql sql-server tsql database-cursor


【解决方案1】:

听起来您可能正在使用 GLOBAL 游标,这可能会导致这样的问题。

如果你必须使用游标:

如果可以,请在所有代码中使用 LOCAL 游标。 例如使用“LOCAL”关键字声明游标,如下所示:

DECLARE yourcursor CURSOR LOCAL ...

【讨论】:

【解决方案2】:

你也可以试试这个

IF CURSOR_STATUS('global', 'Cursorname') >= -1
BEGIN
    CLOSE Cursorname
    DEALLOCATE Cursorname
END

【讨论】:

  • 这正是我的问题。我在事务中间有游标中断,它从未释放它。这解决了它。谢谢!
【解决方案3】:

听起来有点像它被多个线程调用,因此当第二个线程尝试使用该名称时它已经存在。您可以尝试使用名称中的 GUID 等动态命名光标。我不推荐这种方法。

如果可能的话,我建议您从触发代码中删除光标,以支持基于集合的方法。在触发器中使用光标的开销必须相当高。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    • 2018-07-22
    相关资源
    最近更新 更多