2015-10-07 42 views
1

我不明白下面几行的意义:SQL游标提取状态含义

WHILE 1 = 1 
    BEGIN 
     FETCH NEXT FROM SomeCursor INTO @SomeId, @SomeOtherColumn 

     IF @@FETCH_STATUS <> 0 BREAK 

什么的含义,而1 = 1?并且如果获取状态不是0?

感谢

+5

[@@ FETCH_STATUS](https://msdn.microsoft.com/en-us/library/ms187308.aspx) – Lamak

回答

7

WHILE 1=1是一个循环的开始,总是导致TRUE结果,从而使循环开始(也可能永远持续下去):

@@FETCH_STATUS点,如果有仍然是行会从光标获取(或已经获取)。

如果仍然有行可以从光标获取,那么@@FETCH_STATUS为0,这表示SUCCESS

如果@@FETCH_STATUS<> 0(-1或-2),那么它指的是不存在,可以从光标被返回更多的行,您已达到其端部。

这是通常情况下用于从超过游标的循环中断开的条件。

就像@Lamak所评论的,这里是documentation for @@FETCH_STATUS

+0

谢谢,当它是<> 0? – Volkan

+0

非常感谢! – Volkan

3

这是一种常用于避免在代码中编写两行FETCH NEXT行的技巧。它通过WHILE 1 = 1开始一个无限循环,并一直持续到@@FETCH_STATUS返回0以外的值,表明它已经到达光标的末尾,或者发生了错误。

可能@@FETCH_STATUS值是:

Return value Description 
0    The FETCH statement was successful. 
-1    The FETCH statement failed or the row was beyond the result set. 
-2    The row fetched is missing. 
+0

非常感谢! – Volkan

4

1 = 1只是一个短暂的状态总是返回true,那就是永远循环下去(当然,直到你摆脱它在其他地方)。

至于获取状态值,像往常一样MSDN是你的朋友在这里。从https://msdn.microsoft.com/en-us/library/ms187308.aspx

  • 0 = FETCH语句成功。
  • -1 = FETCH语句失败或行超出结果集。
  • -2 =取出的行缺失。

例如,如果你得到0以外的任何东西,事情就会出错,所以没有必要继续。

在附注中,MSDN还指出,这是一件遗留的事情,@@FETCH_STATUS是全局的,因此在使用多个游标时,它不被信任。而是从sys.dm_exec_cursors动态管理功能中查找光标的单个获取状态值。

+0

非常感谢! – Volkan