我应该避免@@ Fetch_Status吗?

时间:2012-10-24 14:44:18

标签: sql-server-2005 cursor

在做了一些阅读后,很明显多个程序可以修改全局变量@@Fetch_Status。我们有一个存储过程,每小时调用其他存储过程(类似于表驱动的触发器,这样客户端获得控制但没有必须触摸但只有一个触发器)。所以调用这些子程序的父程序使用游标。一些子程序也可以使用游标。

我知道每个Fetch Next调用之后会立即进行@@Fetch_Status调用,但事情并行发生我不确定调用@@Fetch_Status是否是线程安全的,特别是考虑到备注部分here。因此,我认为将所有While @@Fetch_Status = 0)次调用替换为

是一个明智的想法
WHILE ( (SELECT fetch_status
FROM sys.dm_exec_cursors(0)
where name = 'server_cursor')=0) BEGIN

这在我的计算机上运行得很好但是当我将它移到客户端机器上时,我了解到我在sys.dm_exec_cursors(0)表上没有选择权限。我收到错误The user does not have permission to perform this action.

或者,如果我尝试select * from sys.syscursors,我会收到错误The SELECT permission was denied on the object 'syscursors', database 'mssqlsystemresource', schema 'sys'.

是否有另一种方法可以确保多个同时游标不相互踩?或者我在这里工作太辛苦了?

1 个答案:

答案 0 :(得分:0)

解决方案是在@@FETCH_STATUS语句后立即检查FETCH NEXT。特别是,确保没有可能改变状态的干预呼叫。如有必要,可以将值保存到声明的局部变量。你提到检查状态"几乎立即"。如果您不确定,最好检查一下代码。

否则,@@FETCH_STATUS应该可靠。