Sintaxe do loop for no SQL Server

238

Qual é a sintaxe de um forloop no TSQL?

Macho
fonte
10
SQL é uma linguagem muito diferente em comparação com o que você está acostumado. É focado no quê , não como . Você diz ao SQL Server quais resultados deseja e deixa-o descobrir como produzir a resposta. Ou, para recarregar o que acabei de dizer - não há um loop for no SQL.
Damien_The_Unbeliever
5
WHILE @I < 10; SET @I = @I + 1; BEGIN; ...; END? No entanto, isso não deve ser usado para a maioria dos processos de consulta (mas às vezes é necessário para manipulação imperativa). Muitas dessas instruções / dicas estão disponíveis no google usando a pesquisa "tsql for loop".
7
Evite loops em favor de JOINs e defina operações.
Oded
2
Se você não é especialista em SQL, não deve considerar usar um loop. Existem apenas algumas condições em que uma é necessária e na maior parte do tempo, usar um laço é o equivalente a empurrar o carro em vez de dirigi-lo. Aprenda a pensar em termos de conjuntos de dados em vez de percorrer os registros. LOoping é uma função de nível especialista, não porque a sintaxe é difícil, mas porque você precisa saber exatamente quanto mal pode causar com ela antes de poder usá-la.
HLGEM
2
Às vezes, ele poderia ser usado para conjurar rapidamente dados de teste em um banco de dados de teste que você excluirá logo em seguida. Nesse caso, usar isso elimina a necessidade de passar por um programa separado, escrito em algo mais como C #, e a engenharia não é uma preocupação importante. Mais uma vez, estou dizendo isso em termos de dados de teste.
Panzercrisis

Respostas:

210

O T-SQL não possui um FORloop, ele possui um WHILEloop
WHILE (Transact-SQL)

WHILE Boolean_expression
BEGIN

END
geléias
fonte
8
JOINs (e operações de conjunto) devem ter preferência sobre construções de loop no SQL.
Oded
6
Não há limite para o estresse (especialmente para aqueles que são novos no SQL), o que Damien disse: "O SQL é uma linguagem muito diferente do que você está acostumado. É focada no que, não como. Você diz ao SQL Server o que resultados que você quer, e deixá-lo descobrir como produzir a resposta ".
ypercubeᵀᴹ
1
É interessante notar que a documentação do MS está errada aqui, realmente. ENQUANTO não usa uma expressão booleana - é necessário um predicado - que, além de poder avaliar como VERDADEIRO ou FALSO, também pode ser DESCONHECIDO.
Damien_The_Unbeliever
360

Não há loop for, apenas o loop while:

DECLARE @i int = 0

WHILE @i < 20
BEGIN
    SET @i = @i + 1
    /* do some work */
END
TcKs
fonte
20
Observe que, se você pretende usar o índice no loop, pode querer incrementar a última coisa em vez da primeira, dependendo do seu caso de uso.
precisa saber é o seguinte
3
Observe também que o valor padrão para a variável local não é suportado no SQL simples. Portanto, você precisa separar SET @i = 0antes do loop.
Nux
1
@ Nux: o 0 é definido durante a declaração explicitamente
TcKs
7
Sim, mas isso não funciona em servidores SQL mais antigos (pelo menos não em 2005).
Nux
Além disso, deve-se notar que geralmente o trabalho é feito antes do número inteiro ser incrementado. Muitos loops for SQL realmente usam esse número inteiro em seu trabalho (iterando de linha para linha ou resultam em tabelas temporárias) e podem ser descartados se o incremento ocorrer no início do ciclo e não no final.
CSS
34

Informação extra

Apenas para adicionar como ninguém postou uma resposta que inclui como realmente iterar um conjunto de dados dentro de um loop, você pode usar as palavras-chave OFFSET FETCH .

Uso

DECLARE @i INT = 0;
SELECT @count=  Count(*) FROM {TABLE}

WHILE @i <= @count
BEGIN

    SELECT * FROM {TABLE}
    ORDER BY {COLUMN}
    OFFSET @i ROWS   
    FETCH NEXT 1 ROWS ONLY  

    SET @i = @i + 1;

END
Dan Cundy
fonte
2
Boa alternativa para usar um cursor.
DanteTheSmith #
28

DECLARE @intFlag INT
SET @intFlag = 1
WHILE (@intFlag <=5) 
BEGIN
    PRINT @intFlag
    SET @intFlag = @intFlag + 1
END
GO
Caxemira
fonte
13
Bem-vindo ao Stack Overflow! Você consideraria adicionar alguma narrativa para explicar por que esse código funciona e o que o torna uma resposta para a pergunta? Isso seria muito útil para a pessoa que fez a pergunta e para qualquer outra pessoa que aparecer.
Andrew Barber
18
Isso é auto-explicativo.
Edward Olamisan 18/06/2015
4
Como isso não é auto-explicativo? Eu tinha a mesma pergunta, entendi a resposta imediatamente.
DanteTheSmith #
1
Como esta resposta difere dos @TcKs, exceto a convenção de nomenclatura?
Sushil Jadhav
7

Que tal agora:

BEGIN
   Do Something
END
GO 10

... é claro que você pode colocar um contador incremental dentro dele, se precisar contar.

i00
fonte
3
'GO 10'? O SQL Server 2008 não gosta.
Recurso
7

O loop For ainda não é oficialmente suportado pelo SQL server. Já existe resposta para alcançar as diferentes formas do FOR Loop. Estou detalhando a resposta sobre maneiras de obter diferentes tipos de loops no SQL Server.

Loop FOR

DECLARE @cnt INT = 0;

WHILE @cnt < 10
BEGIN
   PRINT 'Inside FOR LOOP';
   SET @cnt = @cnt + 1;
END;

PRINT 'Done FOR LOOP';

Se você sabe, você precisa completar primeira iteração do loop de qualquer maneira, então você pode tentar do..while ou repeat..until versão do servidor SQL.

DO..WHILE Loop

DECLARE @X INT=1;

WAY:  --> Here the  DO statement

  PRINT @X;

  SET @X += 1;

IF @X<=10 GOTO WAY;

Repetir..UNTIL Loop

DECLARE @X INT = 1;

WAY:  -- Here the REPEAT statement

  PRINT @X;

  SET @X += 1;

IFNOT(@X > 10) GOTO WAY;

Referência

Somnath Muluk
fonte
Esta parece ter sido copiado-colado-reordenadas aqui: stackoverflow.com/a/46363319/8239061
SecretAgentMan
@ SecretAgentMan: Ambas as respostas estão respondendo a perguntas diferentes. Dados adicionais fornecidos nas duas respostas.
Somnath Muluk
6

Resposta simples é NO !!.

Não existe FORno SQL, mas você pode usar WHILEou GOTOpara obter a maneira como a ferramenta FORfuncionará.

ENQUANTO :

DECLARE @a INT = 10

WHILE @a <= 20
BEGIN
    PRINT @a
    SET @a = @a + 1
END

VAMOS PARA :

DECLARE @a INT = 10
a:
PRINT @a
SET @a = @a + 1
IF @a < = 20
BEGIN
    GOTO a
END

Eu sempre prefiro WHILEa GOTOdeclaração.

Ragul
fonte
1
Eu gosto de como você mencionou as duas alternativas, em vez de apenas 1 como a maioria das respostas
DanteTheSmith #
0

Exemplo de loop While em T-SQL, que lista a data de início e término do mês atual.

DECLARE @Today DATE= GETDATE() ,
@StartOfMonth DATE ,
@EndOfMonth DATE;

DECLARE @DateList TABLE ( DateLabel VARCHAR(10) );
SET @EndOfMonth = EOMONTH(GETDATE());
SET @StartOfMonth = DATEFROMPARTS(YEAR(@Today), MONTH(@Today), 1);

WHILE @StartOfMonth <= @EndOfMonth
BEGIN
    INSERT  INTO @DateList
    VALUES  ( @StartOfMonth );
    SET @StartOfMonth = DATEADD(DAY, 1, @StartOfMonth);
END;

SELECT  DateLabel
FROM    @DateList;  
Sameer
fonte
0

Experimente, aprenda:

DECLARE @r INT = 5
DECLARE @i INT = 0
DECLARE @F varchar(max) = ''
WHILE @i < @r
BEGIN

    DECLARE @j INT = 0
    DECLARE @o varchar(max) = ''
    WHILE @j < @r - @i - 1
    BEGIN
        SET @o = @o + ' '
        SET @j += 1
    END

    DECLARE @k INT = 0
    WHILE @k < @i + 1
    BEGIN
        SET @o = @o + ' *'  -- '*'
        SET @k += 1
    END
    SET @i += 1
    SET @F = @F + @o + CHAR(13)
END
PRINT @F

Com data:

DECLARE @d DATE = '2019-11-01'
WHILE @d < GETDATE()
BEGIN
    PRINT @d
    SET @d = DATEADD(DAY,1,@d)
END
PRINT 'n'
PRINT @d
Mahesh Mitikiri
fonte