名称为...的游标已存在 - SQL Server 2008

时间:2011-07-18 15:56:00

标签: java sql sql-server tsql cursor

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

当我调用更改表的存储过程然后导致触发器运行时,我在Management Studio中执行此操作,所有操作都按预期工作。

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

这种存储过程在我手动执行时是否有效,而在从Web应用程序运行时无效?

3 个答案:

答案 0 :(得分:30)

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

如果必须使用游标:

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

DECLARE yourcursor CURSOR LOCAL ...

答案 1 :(得分:6)

你也可以尝试这个

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

答案 2 :(得分:4)

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

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