SQL游标获取状态含义

Vol*_*kan 6 sql t-sql sql-server database-cursor

我不明白以下行的含义:

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

      IF @@FETCH_STATUS <> 0 BREAK
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Bri*_*dge 10

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动态管理功能中查找光标的单个提取状态值.


Rad*_*hiu 9

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

@@FETCH_STATUS 如果仍有要从游标中提取(或已提取)的行,请指向.

如果仍有可以从游标中获取的行,@@FETCH_STATUS则为0,表示SUCCESS.

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

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

正如@Lamak所评论的那样,这里是@@ FETCH_STATUS文档.


Siy*_*ual 6

这是一种常用的技巧,可以避免FETCH NEXT在代码中两次编写该行。它开始一个无限循环 viaWHILE 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.
Run Code Online (Sandbox Code Playgroud)