SQL游标获取状态含义

时间:2015-10-07 12:28:42

标签: sql sql-server tsql database-cursor

我不明白以下几行的含义:

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

      IF @@FETCH_STATUS <> 0 BREAK

1 = 1时的含义是什么?如果获取状态不是0?

感谢

3 个答案:

答案 0 :(得分:9)

1 = 1只是一个总是返回true的短条件,即永远循环(好吧,直到你在其他地方突破它)。

至于获取状态值,通常MSDN是你的朋友。来自https://msdn.microsoft.com/en-us/library/ms187308.aspx

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

E.g。如果你得到的不是0,那么事情就出错了,所以继续没有意义。

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

答案 1 :(得分:8)

WHILE 1=1是循环的开始,总是会产生TRUE结果,从而使循环开始(并可能永远继续):

@@FETCH_STATUS指向是否仍有从光标中提取(或已提取)的行。

如果仍然可以从光标中获取行,则@@FETCH_STATUS为0,显示 SUCCESS

如果@@FETCH_STATUS &lt;&gt; 0 ( - 1或-2)然后它指出没有更多的行可以从光标返回并且你已经到达它的末尾。

这是用于中断通过游标的循环的常用条件。

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

答案 2 :(得分:4)

这是一种常用于避免在代码中编写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.