O uso da programação no SQL Server envolve a criação e uso de variáveis, o uso de elementos de controle de fluxo e também o uso de Stored Procedures (que serão abordados no próximo artigo do curso). Assim conseguimos incluir uma determinada lógica em nossas querys.

Variáveis de Usuário

Uma variável local do Transact SQL é um objeto nos scripts e batches que mantém um valor de dado. Através do comando DECLARE, podemos criar variáveis locais, sendo feito isso no corpo de uma procedure ou batch.

Podemos ver abaixo, na Listagem 1, dois exemplos de declarações de variáveis, ambos estão corretos, depende do programador qual irá utilizar.

--Exemplo 1

DECLARE @IdUsuario AS INT, @Nome AS VARCHAR(50), @Idade AS SMALLINT

--Exemplo 2

DECLARE @IdUsuario AS INT

DECLARE @Nome AS VARCHAR(50)

DECLARE @Idade AS SMALLINT
Listagem 1 – Declaração de Variáveis Locais

Em ambos os exemplos temos o uso do caractere coringa @ antes da variável. Este é um padrão para declarar variáveis e deve ser seguido pelos programadores. Podemos notar ainda que cada variável declarada tem seu datatype atribuído.

Obs.: Lembrando que o AS é um alias e seu uso é opcional.

É possível atribuir valores para cada uma das variáveis. Para isso, usamos o comando SET ou o SELECT, como vemos no exemplo da Listagem 2.

DECLARE @IdUsuario AS INT, @Nome AS VARCHAR(50), @Idade AS SMALLINT

SET @IdUsuario = 1

SELECT @Nome = ColunaNome FROM Tabela @Idade = ColunaIdade FROM Tabela

Listagem 2 – Atribuindo valores para as variáveis declaradas

Seja com SET ou SELECT, conseguimos atribuir valor as variáveis, depende da necessidade de cada desenvolvedor.

Controle de Fluxo

Assim como muitas linguagens de programação utilizam operadores de condição, o SQL não poderia ficar de fora. Ele trabalha com esses elementos, também denominado de controle de fluxo, permitindo assim ao desenvolvedor criar lógicas para as mais variadas situações e regras de negócio de seu sistema. Os elementos de controle de fluxo que iremos ver são, nessa ordem, BEGIN/END, IF/ELSE, CASE/WHEN/THEN/END, WHILE e o TRY...CATCH.

BEGIN/END

Os elementos BEGIN e END tem o objetivo de iniciar e finalizar, respectivamente, um bloco de comandos, de maneira que este possa ser posteriormente executado. Podemos aninhar blocos de comando utilizando estes elementos.

Caso seja executado um bloco de comandos logo após a realização de um teste de condição, os elementos BEGIN e END, são usados logo após um comando IF ou WHILE. Veremos mais a frente exemplos com o uso destes elementos.

IF/ELSE

Os elementos IF e ELSE são usados para testar condições quando um comando Transact-SQL é executado. O IF e ELSE funcionam similarmente aos comandos de mesmo nome usados em linguagens como C# por exemplo, para testar condições de execução de comandos.

Confira abaixo a sintaxe do IF e ELSE no SQL:

 IF Expressao_Booleana
          { comando_sql | bloco_comando }
 [ ELSE
          { comando_sql | bloco_comando } ]

Sendo que o argumento Expressao_Booleana pode retornar TRUE ou FALSE. Se na expressão booleana houver um comando SELECT, ele deve ser colocado entre parênteses. Já o comando_sql | bloco_comando representa um comando Transact-SQL ou um agrupamento de comandos.

Na Listagem 3 temos um exemplo com os elementos BEGIN/END em conjunto com IF/ELSE.

IF @IdUsuario > 0

   BEGIN

   SELECT IdUsuario

     FROM Clientes

    WHERE IdUsuario = @IdUsuario

   END

ELSE

   BEGIN

   SELECT TOP 1 @IdUsuario = IdUsuario

     FROM Clientes

   END

Listagem 3 – Exemplo com IF/ELSE e BEGIN/END

CASE/WHEN/THEN/END

O elemento CASE é utilizado para conferir uma lista de condições e, então, retornar uma entre várias expressões de resultado possíveis. CASE, que é usado em conjunto com o comando SELECT, é útil quando a intenção é a de evitar que sejam criados comandos IF aninhados. Ele é considerado como uma alternativa ao IF. Dois formatos podem ser designados ao comando CASE: a função simples e a função pesquisada. Com a primeira, o resultado é obtido por meio da comparação de uma expressão com uma série de expressões simples. Na segunda função, é obtido um resultado específico a partir de um conjunto de expressões booleanas.

Na Listagem 4 pode ser visto um exemplo prático de uso do CASE.

SELECT IdProduto, Nome, Tipo =

  CASE

    WHEN 'A' THEN 'Produto Nacional'

    WHEN 'B' THEN 'Produto dos Estados Unidos'

    WHEN 'C' THEN 'Produto da China'

    ELSE 'Produto de outros países'

  END AS [Tipo do Produto]

FROM Produtos

Listagem 4 – Exemplo de uso do elemento CASE em um SELECT

WHILE

Assim como o IF/ELSE, o comando WHILE funciona da mesma forma que nas linguagens de programação: ele faz com que um comando ou bloco de comandos SQL seja executado repetidamente, ou seja, é criado um loop o comando ou bloco de comandos, que será executado enquanto a condição especificada for verdadeira.

A Listagem 5 nos dá um exemplo prático do uso do WHILE.

DECLARE @Contador AS SMALLINT

SET @Contador = 1

WHILE @Contador <= 10

  BEGIN

    SELECT @Contador

    SET @Contador = @Contador + 1

  END	

Listagem 5 – Exemplo de uso do comando WHILE

No exemplo acima inicializamos a variável @Contador e atribuímos a ela o valor 1. Logo após é especificado um loop onde dentro dele a variável será incrementada em 1 a cada “passada” do laço. Esse incremento será feito até que o valor da variável chegue a 10.

Utilizando os comandos BREAK e CONTINUE, que serão apresentados a seguir, é possível controlar de dentro do loop a execução dos comandos do WHILE.

WHILE com BREAK

Podemos usar o WHILE com BREAK quando desejamos interromper o loop em um determinado ponto. O BREAK também pode ser usado para finalizar a execução de um loop dentro de um comando IF/ELSE.

Vemos na Listagem 6 um exemplo com o uso do BREAK.

DECLARE @Contador AS SMALLINT

SET @Contador = 1

WHILE @Contador <= 10

  BEGIN

    SELECT @Contador

    IF @Contador = 5

      BREAK

    SET @Contador = @Contador + 1

  END

Listagem 6 – Exemplo do comando BREAK em conjunto com o WHILE

Com a execução do código acima será exibido em tela os números de 1 a 5. Ao chegar ao número 5, o loop será interrompido pelo BREAK.

WHILE com CONTINUE

Com o CONTINUE é possível reiniciar a execução de um loop executado pelo WHILE e interrompido pelo BREAK. Da mesma forma que o BREAK, o CONTINUE geralmente é iniciado por uma condição explicitada pelo IF. Havendo comandos após o CONTINUE, eles serão ignorados.

Podemos ver um exemplo com o CONTINUE na Listagem 7.

DECLARE @Contador AS SMALLINT

SET @Contador = 1

WHILE @Contador <= 10

  BEGIN

    SELECT @Contador

    IF @Contador <= 5

      BEGIN

        SET @Contador = @Contador + 1

        CONTINUE   

      END   

    BREAK

  END

Listagem 7 – Exemplo do comando CONTINUE em conjunto com o WHILE

Fonte de Consulta: Apostila de SQL Server, da Impacta Tecnologia.