由于 @@FETCH_STATUS 对于在一个连接上的所有游标是全局性的,要小心使用 @@FETCH_STATUS 。在执行一条 FETCH 语句后,必须在对另一游标执行另一 FETCH 语句前测试 @@FETCH_STATUS 。在任何提取操作出现在此连接上前,@@FETCH_STATUS 的值没有定义。例如,用户从一个游标执行一条 FETCH 语句,然后调用一个存储过程,此存储过程打开并处理另一个游标的结果。当控制从被调用的存储过程返回后,@@FETCH_STATUS 反映的是在存储过程中执行的最后的 FETCH 语句的结果,而不是在存储过程被调用之前的 FETCH 语句的结果。
fetch next from my_cursor
读第一条记录,此时成功 @@FETCH_STATUS=0
进入循环,读下一条,此时成功 @@FETCH_STATUS=0
满足条件,循环,再读,没有记录了,所以输出一个空结果.
此时,@@FETCH_STATUS=-1,退出循环
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
有什么好办法解决总是多出一行这样的情况吗?
你的意思是:
while @@FETCH_STATUS<>-1
begin IF @@fetch_status <> -2
fetch next from my_cursor
end close my_cursor
你的游标的类型决定了,你使用Fetch后获得的结果
如果 游标是静态的 你总可以使用 Fetch来获得你想要的结果,因为 游标只是tempdb数据副本的信息
如果 游标是动态的 修改[本次连接内的所有的操作]均可影响到你的结果,除非你设置了隔离级别.你的Fetch的结果有可能 打开时还存在而Fetch是就已经不存在了[@@Fetch_status=-2].
如果 游标是键集的[当然在Declare该游标时必须 有唯一的 键集索引才可以,否则它自动转化到 静态游标,不是你想要的结果],修改键集值时,如果修改后的结果在该游标中已经存在了,那么她将回自动在current位置的下一个位置,插入一条等同的记录,只是有_1来表示,_2来表示... ... 所以这时,如果你使用的是Fetch语句的话,将可能进如死循环!
瞎说的,希望没有 误导你!