Sintaxe do loop for no SQL Server


238

Qual é a sintaxe de um forloop no TSQL?


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

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

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

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

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.


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


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.


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;  

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.