由于 @@FETCH_STATUS 对于在一个连接上的所有游标是全局性的,要小心使用 @@FETCH_STATUS 。在执行一条 FETCH 语句后,必须在对另一游标执行另一 FETCH 语句前测试 @@FETCH_STATUS 。在任何提取操作出现在此连接上前,@@FETCH_STATUS 的值没有定义。例如,用户从一个游标执行一条 FETCH 语句,然后调用一个存储过程,此存储过程打开并处理另一个游标的结果。当控制从被调用的存储过程返回后,@@FETCH_STATUS 反映的是在存储过程中执行的最后的 FETCH 语句的结果,而不是在存储过程被调用之前的 FETCH 语句的结果。

解决方案 »

  1.   

    正常啊. @@FETCH_STATUS=0 是判断 fetch next from my_cursor 是否成功,而不是判断是否已经到记录结束.所以有两条记录的工作就是这样的:
    fetch next from my_cursor 
    读第一条记录,此时成功 @@FETCH_STATUS=0
    进入循环,读下一条,此时成功 @@FETCH_STATUS=0
    满足条件,循环,再读,没有记录了,所以输出一个空结果. 
    此时,@@FETCH_STATUS=-1,退出循环
      

  2.   

    DECLARE <cursor_name, sysname, test_cursor> CURSORFOR <select_statement, , SELECT au_fname FROM pubs.dbo.authors>DECLARE @name varchar(40)
    OPEN <cursor_name, sysname, test_cursor>FETCH NEXT FROM <cursor_name, sysname, test_cursor> INTO @name
    WHILE (@@fetch_status <> -1)
    BEGIN
    IF (@@fetch_status <> -2)
    BEGIN
    -- PRINT 'add user defined code here'
    -- eg.
    DECLARE @message varchar(100)
    SELECT @message = 'my name is: ' + @name
    PRINT @message
    END
    FETCH NEXT FROM <cursor_name, sysname, test_cursor> INTO @name
    ENDCLOSE <cursor_name, sysname, test_cursor>
    DEALLOCATE <cursor_name, sysname, test_cursor>
    GO
      

  3.   

    TO:zjcxc(邹建) 
      有什么好办法解决总是多出一行这样的情况吗?
      

  4.   

    TO: wanyingsong(豌豆)
      你的意思是:
    while @@FETCH_STATUS<>-1
         begin           IF @@fetch_status <> -2
         fetch next from my_cursor
     
         end close my_cursor
      

  5.   

    关于游标:
        你的游标的类型决定了,你使用Fetch后获得的结果
        
        如果 游标是静态的 你总可以使用 Fetch来获得你想要的结果,因为 游标只是tempdb数据副本的信息
        如果 游标是动态的 修改[本次连接内的所有的操作]均可影响到你的结果,除非你设置了隔离级别.你的Fetch的结果有可能 打开时还存在而Fetch是就已经不存在了[@@Fetch_status=-2]. 
        如果 游标是键集的[当然在Declare该游标时必须 有唯一的 键集索引才可以,否则它自动转化到 静态游标,不是你想要的结果],修改键集值时,如果修改后的结果在该游标中已经存在了,那么她将回自动在current位置的下一个位置,插入一条等同的记录,只是有_1来表示,_2来表示... ...    所以这时,如果你使用的是Fetch语句的话,将可能进如死循环!   
        瞎说的,希望没有 误导你!