Sql server 2005 我应该避免@@Fetch\u状态吗?

Sql server 2005 我应该避免@@Fetch\u状态吗?,sql-server-2005,cursor,Sql Server 2005,Cursor,阅读一些内容后,很明显,多个过程可以修改全局变量@@Fetch\u Status。我们有一个每小时调用其他存储过程的存储过程(有点像一个表驱动的触发器,这样客户机就可以获得控制权,但不必碰任何一个,只需碰一个触发器)。因此,调用这些子过程的父过程使用游标。一些子过程也可以使用游标 我知道每次调用@@Fetch\u Status都会紧接着一个@@Fetch\u Status调用,但由于事情同时发生,我不确定调用@@Fetch\u Status是否是线程安全的,特别是考虑到备注部分。因此,我认为在@

阅读一些内容后,很明显,多个过程可以修改全局变量
@@Fetch\u Status
。我们有一个每小时调用其他存储过程的存储过程(有点像一个表驱动的触发器,这样客户机就可以获得控制权,但不必碰任何一个,只需碰一个触发器)。因此,调用这些子过程的父过程使用游标。一些子过程也可以使用游标

我知道每次调用
@@Fetch\u Status
都会紧接着一个
@@Fetch\u Status
调用,但由于事情同时发生,我不确定调用
@@Fetch\u Status
是否是线程安全的,特别是考虑到备注部分。因此,我认为在@Fetch_Status=0)调用时替换所有的
调用是一个好主意

WHILE ( (SELECT fetch_status
FROM sys.dm_exec_cursors(0)
where name = 'server_cursor')=0) BEGIN
这在我的计算机上运行得很好,但当我将其移到客户机上时,我发现我对
sys.dm\u exec\u游标(0)
表没有选择权限。我收到错误信息
用户没有执行此操作的权限。

或者,如果我尝试从sys.syscursors
select*from sys.syscursors
I得到错误
select权限在对象'syscursors',数据库'mssqlsystemresource',架构'sys'上被拒绝。


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

解决方法是在您的
FETCH NEXT
语句之后立即检查
@@FETCH\u状态。特别是,确保没有可能改变状态的干预电话。如有必要,可以将该值保存到声明的局部变量。您提到“几乎立即”检查状态。如果您不确定,最好检查代码


否则,,
@@FETCH\u STATUS
应该是可靠的。

返回针对连接当前打开的任何游标发出的上一个游标FETCH语句的状态。
因此,只有在调用
FETCH
和检查
@@Fetch\u Status
。当然,没有一个过程是这样写的,但是procA和procB都使用游标,procA调用下一行,但在检查Fetch Status之前,procB并行地获取它的最后一行,从而将全局
@@Fetch\u Status
设置为-1。然后,当procA检查
@@Fetch\u Status
时,它认为它的行都被提取了,但它们没有。或者SQL比这更聪明吗?来自单个连接的过程不会并行运行。唯一可以并行运行的是针对单个查询的并行执行计划。Ok。如果ProcA和ProcB都计划在上午10点执行呢。服务器是否并行运行这些?或者它是先做一个,然后再做另一个?如果通过SQL代理计划,它们将在不同的SPID(连接)下运行,因此不会看到彼此的
@@Fetch\u状态
。如果没有,请解释“预定”是什么意思