Significado do Estado de obtenção do cursor SQL

não entendo o significado das seguintes linhas:

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

      IF @@FETCH_STATUS <> 0 BREAK

quais são os significados de enquanto 1=1? e se o estado de obtenção for diferente de 0?

Obrigado.
 3
Author: Volkan, 2015-10-07

3 answers

WHILE 1=1 é o início de um loop e sempre resulta em um resultado TRUE, assim fazendo o loop começar (e potencialmente Continuar para sempre):

@@FETCH_STATUS pontos se ainda existirem linhas a obter (ou foram obtidas) do cursor.

Se ainda existirem linhas que possam ser obtidas a partir do cursor, então @@FETCH_STATUS é 0, o que mostra sucesso.

SE @@FETCH_STATUS For 0 (-1 ou -2) então aponta que não há mais linhas que podem ser devolvidas do cursor e você chegou ao seu fim.

Esta é a condição habitual usada para partir de um laço que está a passar por cima de um cursor.

Tal como @Lamak comentou, aqui está a documentação para @FETCH_STATUS .

 7
Author: Radu Gheorghiu, 2015-10-07 12:33:25

1=1 é apenas uma condição curta que sempre retornam verdadeiros, isto é, loop para sempre (bem, até que você fuja dele em outro lugar).

Quanto aos valores de obtenção do Estado, como habitualmente o MSDN é o seu amigo aqui. De https://msdn.microsoft.com/en-us/library/ms187308.aspx

  • 0 = a declaração de busca foi bem sucedida.
  • -1 = a declaração de obtenção falhou ou a linha estava para além do conjunto de resultados.
  • -2 = falta a linha obtida.

Por exemplo, se conseguires qualquer coisa além de 0, as coisas correram mal, por isso não vale a pena continuar.

Em uma nota lateral, MSDN também nota que é uma coisa de legado, {[[0]} é global, e portanto, onde vários cursores estão sendo usados não é de confiança. Em vez disso, procure o valor do Estado de obtenção individual do seu cursor a partir da função de gestão dinâmica sys.dm_exec_cursors.

 5
Author: Bridge, 2015-10-07 12:36:46

Este é um truque que é comumente usado para evitar escrever a linha FETCH NEXT duas vezes no código. Ele inicia um loop infinito via WHILE 1 = 1 e continua até que o @@FETCH_STATUS retorna algo diferente de 0, indicando que ele chegou ao fim do cursor, ou um erro ocorreu.

Os valores possíveis @@FETCH_STATUS são:

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.
 4
Author: Siyual, 2015-10-07 12:33:11