4

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

我知道每次Fetch Next调用之后几乎都会立即@@Fetch_Status调用,但是由于并行发生的事情,我不确定调用是否@@Fetch_Status是线程安全的,尤其是考虑到此处的备注部分。所以我认为将我所有的电话替换为类似的东西是一个好主意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'.

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

4

1 回答 1

0

@@FETCH_STATUS解决方案是在您的FETCH NEXT陈述之后立即进行检查。特别是,确保没有可能改变状态的干预呼叫。如有必要,您可以将该值保存到已声明的局部变量中。您提到“几乎立即”检查状态。如果你不确定,你最好检查你的代码。

否则,@@FETCH_STATUS应该是可靠的。

于 2014-03-20T19:35:55.157 回答