Usando a instrução WHILE nos procedimentos armazenados

Depois de ler este artigo, você vai entender o básico de usar a instrução WHILE para escrever um loop dentro de um procedimento armazenado.

Todos os exemplos para esta lição são baseados no Microsoft SQL Server Management Studio e nas sample databases AdventureWorks e WideWorldImporters. Você pode começar a usar estas ferramentas gratuitas com o meu guia começar a usar o servidor SQL.

WHILE, BREAK, and CONTINUE

The WHILE statement is used to repeatedly execute a block of SQL statements. O bloco é executado repetidamente se a condição da instrução WHILE for verdadeira.

O formato geral das declarações WHILE é:

WHILE conditionBEGIN -- code block run when condition is TRUEEND

Se você se encontrar repetindo afirmações, especialmente aquelas que caem em um padrão, então, há uma possibilidade que você pode usar uma declaração WHILE para salvar alguma digitação e tornar o seu programa mais divertido de escrever!

Por exemplo, vamos supor que você precisa criar uma tabela temporária contendo a data de início de cada semana. Claro que poderíamos escrever 52 declarações de inserção individuais, mas isso é aborrecido!

INSERT INTO @myTable VALUES (0, 12/31/2017)INSERT INTO @myTable VALUES (1, 01/07/2018)INSERT INTO @myTable VALUES (2, 01/14/2018)…INSERT INTO @myTable VALUES (52, 12/30/2018 )

em vez disso, use o comando WHILE para percorrer as 52 semanas, inserindo a data de início de cada semana na tabela. Você pode ver como fazemos isso no seguinte exemplo.

--Setup VariablesDECLARE @myTable TABLE(WeekNumber int, DateStarting smalldatetime)DECLARE @n int = 0DECLARE @firstWeek smalldatetime = '12/31/2017'--Loop Through weeksWHILE @n <= 52BEGIN INSERT INTO @myTable VALUES (@n, DATEADD(wk,@n,@firstWeek)); SELECT @n = @n + 1END--Show ResultsSELECT WeekNumber, DateStartingFROM @myTable

o que faz esta marcação é a função DATEADD. Note que o DATEADD(wk, @n, @firstWeek) adiciona uma semana de trabalho de dias à nossa data @firstWeek. Na primeira iteração adiciona 0 semanas. Na segunda iteração, @n = 1, então adiciona 1 semana, e assim por diante.

Aqui estão mais alguns pontos:

  • a declaração de WHILE testa a variável @n. If it is <= 52, the program block (green), can run.
  • Cada vez que o bloco é executado, a variável @n é incrementada por um. Isto é importante. Se isso não acontecesse, o valor nunca seria maior que 52, e nosso programa executaria o bloco de código, on and on, without end. Isto é chamado um laço infinito.reforço para o #2 acima! É importante que o seu loop tenha uma condição final. No nosso caso, certificamo-nos de que a variável @n é incrementada, e que acabará por ser maior que 52.
  • usamos o valor @n para” conduzir ” o valor da data. Adicionando semanas à nossa data de base, @firstWeek, podemos calcular as datas de início subsequentes.

Aqui estão os resultados:

ENQUANTO Exemplo de Declaração de Resultados

Como você pode ver, a partir deste loop simples, nós fomos capazes de criar alguns dados interessantes, e era mais divertido para fazer wo usando funções de data, que para “codificar” a instrução. Usar laços é muito poderoso.

usando BREAK to Short Circuit a Loop

The BREAK statement is used to forcibly exit from a WHILE statement’s code block.

no exemplo seguinte nós alteramos a declaração de WHILE. Ele agora usa a frase BREAK, que é colorida em verde.

Existem duas alterações:

  1. a condição de ‘WHILE Statement’ é sempre avaliada como verdadeira, uma vez que @n é sempre maior ou igual a zero.
  2. o teste de declaração de FI para a condição final, e quando verdadeiro, executa a quebra.
DECLARE @myTable TABLE(WeekNumber int, DateStarting smalldatetime)DECLARE @n int = 0DECLARE @firstWeek smalldatetime = '12/31/2017'WHILE @n > -1BEGIN INSERT INTO @myTable VALUES (@n, DATEADD(wk,@n,@firstWeek)); SELECT @n = @n + 1 IF @n > 52 BREAKEND

a declaração de quebra é útil para terminar a execução. Se enquanto as declarações são aninhadas, então a maior parte do laço interior é retirada.

usando continuar a reiniciar um ciclo

a instrução continuar reinicializa um bloco de código da instrução WHILE. Todas as declarações encontradas após a continuação não são executadas.

Por exemplo, no seguinte, a declaração de impressão nunca é executada.

DECLARE @myTable TABLE(WeekNumber int, DateStarting smalldatetime)DECLARE @n int = 0DECLARE @firstWeek smalldatetime = '12/31/2017'WHILE @n > -1BEGIN INSERT INTO @myTable VALUES (@n, DATEADD(wk,@n,@firstWeek)); SELECT @n = @n + 1 IF @n > 52 BREAK ELSE CONTINUE PRINT ‘I Never get executed’END

a razão é a força de quebra de uma saída, ou quando a continuação é executada, o laço é reiniciado para o início do bloco.



Deixe uma resposta

O seu endereço de email não será publicado.