2011-07-18 34 views
11

我有一个触发器,用于在对表进行更改时执行一些审计任务。在这个触发器中有一个WHILE循环,在循环中有一个游标被声明,使用,关闭,然后在循环的下一次迭代之前解除分配。具有名称的游标已存在 - SQL Server 2008

当我调用一个更改表的存储过程并导致触发器运行时,我从Management Studio中执行此操作,所有操作都按预期方式进行。

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

是否有一个原因,当我手动执行该存储过程时工作,而不是从Web应用程序运行时工作?

+0

具有光标和while循环触发器是需要进行重构的触发器。 – HLGEM

回答

28

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

如果你必须使用游标:

如果你能在所有的代码使用本地游标。 例如使用“本地”的关键字,这样的声明光标:

DECLARE yourcursor CURSOR LOCAL ... 
+0

这解决了我的问题在多线程应用程序中的游标。也可以通过数据库选项将其设置为默认本地: http://msdn.microsoft.com/en-us/library/ms188124(v=sql.105).aspx – Christian

4

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

我建议你尽可能地从你的触发代码中移除游标,以支持基于集合的方法。在触发器内使用光标的开销必须很高。

6

你也可以试试这个

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