Olá galera o/

Nesta postagem vou mostrar como podemos fazer loops no SQL Server / Azure SQL / SQL DW. Como a função LOOP (For da programação) não existe no SQL Server, podemos simular o mesmo cenário utilizando o comando WHILE.

Primeiro vamos entender como funciona o comando WHILE.
Primeiro iniciamos o fluxo do loop com um valor, este valor passará por uma analise lógica que fará a iteração acontecer, a cada iteração do loop, a condição definida é verificada e de acordo com o resultado da condição, o fluxo do código é determinado. Se o resultado da condição for verdadeiro, a ele executará algum tipo de instrução (no nosso caso será um código SQL), caso contrário, o fluxo de código sairá do loop. Caso exista algum código fora do loop, o mesmo será executado.

Sintaxe:

WHILE condicao
BEGIN
   <codigo_sql>
END

CONDICAO é o número de vezes que você deseja que o LOOP seja executado e o CODIGO_SQL é o código que será executado em cada iteração do loop.

Segue link do WHILE no site da Microsoft: https://docs.microsoft.com/pt-br/sql/t-sql/language-elements/while-transact-sql

Para exemplificar vamos declarar uma variável do tipo TINYINT chamada contador, atribuiremos o valor 0 para esta variável. No WHILE vamos definir a seguinte condição: enquanto o valor da variável for menor ou igual a 5 continue fazendo o LOOP. Dentro do corpo do WHILE vamos exibir a variável contador sendo incrementada a cada iteração, cada vez que esta variável é exibida, atribuímos (setamos) o valor do contador + 1 para a variável, ou seja, se no primeiro loop o valor é 0, ao entrar no corpo do WHILE a variável vai receber o valor dela mesma + 1, armazenando agora o valor 1. Este processo é repetido até que, a variável atenda o valor da condição do WHILE. Uma vez que a condição é atendida o LOOP é finalizado.

DECLARE @CONTADOR TINYINT 
SET @CONTADOR=0

WHILE ( @CONTADOR <= 5)
BEGIN
    PRINT @CONTADOR
    SET @CONTADOR  = @CONTADOR  + 1
END

Podemos utilizar outras palavras reservadas junto com o comando WHILE como o BREAK e o CONTINUE. Mas primeiros vamos entender qual a finalidade deles em conjunto com o WHILE.

BREAK é usado quando você deseja sair de um WHILE. Você usa a instrução BREAK para encerrar um WHILE antecipadamente. Se houver WHILEs aninhados, a instrução BREAK encerrará o WHILE mais interno.

CONTINUE é usado quando você para interromper a iteração atual do WHILE quando ocorrem certas condições, em seguida, inicia-se uma nova iteração desde o início do loop.

Em ambas as palavras chaves utilizados os comandos IF..ELSE para verificar se a condição ocorreu ou não. Postagem sobre como utilizar o IF..ELSE >> LINK <<

BREAK:

Definimos o valor da variável como 0, logo no inicio do loop verificamos utilizando o IF..ELSE se o valor da variável contador é igual a 3, caso seja, ele tem que encerrar o loop imediatamente. Caso o valor não seja igual a 3, o loop vai ser realizado normalmente, além disso a mensagem “LOOP INTERNO, ITERAÇÃO + VALOR DA ITERAÇÃO” é exibida mostrando quantas iterações ele realizou até que o BREAK seja acionado e encerre o loop.

Observem que, quando o valor da variável é igual a 3, o loop é encerrado e são exibidas 3 mensagens de iteração. A iteração 0, ou seja, quando a variável estava com valor 0 e assim sucessivamente.

DECLARE @CONTADOR TINYINT 
SET @CONTADOR=0

WHILE ( @CONTADOR <= 5)
BEGIN
	IF @CONTADOR = 3
	BREAK;
	ELSE
		PRINT 'LOOP INTERNO, ITERAÇÃO: ' + CAST(@CONTADOR AS CHAR(1));
		SET @CONTADOR  = @CONTADOR  + 1
END

CONTINUE:

Definimos o valor da variável como 0, logo no inicio do loop verificamos utilizando o IF..ELSE se o valor da variável contador é igual a 3, caso seja, ele tem que encerrar o loop imediatamente. Caso o valor não seja igual a 3, vai entrar na condição ELSE e o loop será reiniciado com uma nova iteração.

Observem que, ao entrar na nova na iteração (WHILE interno), a iteração inicial é ignorada e ele exibe 3 mensagens sendo que a primeira iteração exibida na saída é a iteração 1 e não a iteração 0. Quando a variável recebe o valor 3 o comando BREAK é acionado e o Loop é finalizado.

DECLARE @CONTADOR TINYINT 
SET @CONTADOR = 0

WHILE @CONTADOR <= 5
BEGIN
   IF @CONTADOR = 3
      BREAK;
   ELSE
	   BEGIN
		  SET @CONTADOR = @CONTADOR + 1;
		  PRINT 'LOOP INTERNO COM WHILE, INTERAÇÃO: ' + CAST(@CONTADOR AS CHAR(1));
		  CONTINUE;
	   END;
END;

INSERINDO REGISTROS EM UMA TABELA COM WHILE:

Também podemos utilizar o WHILE para inserirmos vários registros em uma tabela até que uma determinada condição seja atendida.

Vamos criar uma tabela chama TB_WHILE com 3 colunas, uma coluna chamada COD_WHILE do tipo smallint e com a clausula IDENTITY (AUTO INCREMENTAL), uma coluna chamada TEXT_WHILE do tjpo varchar (20) e uma coluna chamada VALUE_WHILE do tipo int. A tabela vai ser criada utilizando variável do tipo tabela, se você ainda não sabe o que é variável do tipo tabela sugiro olhar esta postagem que fiz explicando um pouco sobre a mesma >> LINK <<

O nosso cenário é o seguinte: Queremos inserir registros em uma tabela até que o valor da variável atinga o valor de 10000. Para isso vamos declarar uma variável do tipo int chama value_increment que armazenará o valor 1, ou seja, toda vez que um insert for realizado a variável vai incrementando o valor até chegar ao valor de 10000. Resumindo vamos ter 10 mil inserções na tabela.

No corpo do WHILE vamos executar um insert nas colunas TEXT_WHILE e VALUE_WHILE passando como valor na coluna TEXT_WHILE o texto “TEXT NUMBER: ” concatenado com a variável VALUE_INCREMENT, para a coluna VALUE_WHILE o valor da variável VALUE_INCREMENT multiplicado por 10. A coluna COD_WHILE é auto incremental, ou seja, gera a numeração automaticamente e não precisa ser declarado no insert.

Etapas:
1 – Criar a variável VALUE_INCREMENT
2 – Criar a variável do tipo tabela chamada de TB_WHILE com as colunas COD_WHILE, TEXT_WHILE e VALUE_WHILE.
3 – Setar (atribuir) o valor na VALUE_INCREMENT passando o valor 1.
4 – Construir o código WHILE com o comando de INSERT na tabela TB_WHILE
5 – Realizar um COUNT para verificar quantos registros foram inseridos.
6 – Realizar um SELECT para ver o resultado dos INSERTs




DECLARE @VALUE_INCREMENT INT

DECLARE @TB_WHILE TABLE (
COD_WHILE SMALLINT IDENTITY,
TEXT_WHILE VARCHAR (20),
VALUE_WHILE INT)
 
SET @VALUE_INCREMENT= 1

WHILE @VALUE_INCREMENT <= 10000
BEGIN
    INSERT INTO @TB_WHILE (TEXT_WHILE,VALUE_WHILE)
	VALUES (CONCAT('TEXT NUMBER: ', @VALUE_INCREMENT), @VALUE_INCREMENT *10)

    SET @VALUE_INCREMENT  = @VALUE_INCREMENT + 1
END

SELECT COUNT(*) AS QTD_ROWS FROM @TB_WHILE
--SELECT * FROM @TB_WHILE

Lembrar de executar inteiro junto para que funcione corretamente, pois estamos trabalhando com variáveis.
Neste Exemplo realizamos apenas o COUNT para visualizarmos a quantidade de registros inseridos na tabela. 10 mil linhas foram inseridas na variável do tipo tabela @TB_WHILE.

DECLARE @VALUE_INCREMENT INT

DECLARE @TB_WHILE TABLE (
COD_WHILE SMALLINT IDENTITY,
TEXT_WHILE VARCHAR (20),
VALUE_WHILE INT)
 
SET @VALUE_INCREMENT= 1

WHILE @VALUE_INCREMENT <= 10000
BEGIN
    INSERT INTO @TB_WHILE (TEXT_WHILE,VALUE_WHILE)
	VALUES (CONCAT('TEXT NUMBER: ', @VALUE_INCREMENT), @VALUE_INCREMENT *10)

    SET @VALUE_INCREMENT  = @VALUE_INCREMENT + 1
END

--SELECT COUNT(*) AS QTD_ROWS FROM @TB_WHILE
SELECT * FROM @TB_WHILE

Lembrar de executar inteiro junto para que funcione corretamente, pois estamos trabalhando com variáveis. Neste Exemplo executamos um SELECT * FROM para a exibição de todas as colunas da tabela.

A postagem de hoje acaba por aqui, espero que tenham entendido como realizar LOOPs no SQL Server utilizando o WHILE. Espero que este post seja útil nos seus estudos ou no seu trabalho.

Desejo a todos uma boa leitura, boa prática e bons estudos.

Para quem quer estudar:

  • Para a Certificação Microsoft MTA Database Fundamentals | Banco de Dados Relacional e Linguagem T-SQL.
    • Segue o link do curso na Udemy. >> LINK <<
  • Sobre Bancos da Dados no Azure
    • Segue o link do curso na Udemy. >> LINK <<

Não se esqueçam de avaliar esta postagem através da ESTRELAS abaixo das redes sociais, isso vai me ajudar muito a melhorar as postagens.

Quem quiser mandar comentários, sugestões, criticas e complementos, fiquem a vontade, pois feedbacks positivos ou negativos engradecem meu conhecimento para que possa melhorar as postagem para vocês.

Até a próxima o/

Acessem nossas Redes Sociais: