Olá pessoal!

Hoje gostaria de iniciar uma série de posts com vocês sobre como programar e criar objetos executáveis no banco que controlam e gerenciam certos comportamentos no seu ambiente.

Neste primeiro post, quero trazer conceitos e possibilidades que a linguagem T-SQL permite, para programar objetos e rotinas dentro do banco de dados.

Os conceitos que iremos ver ao longo são:

  1. Variáveis
  2. Rotinas
  3. Cursor
  4. Stored procedure
  5. Triggers

Variáveis

São estruturas que permitem armazenar dados de uma forma temporária para serem utilizados no mesmo bloco de comando SQL.

Criamos e validamos com duas estruturas:

  • Declare – cria a variável
  • Set – atribui o valor

Ao executar todo este bloco de comando, terei o retorno do valor 10, já que a variável que foi selecionada recebeu este valor.

Outra maneira de atribuir um valor para a variável seria desta forma.

Evite utilizar diversas variáveis para a mesma query, assim como um subselect, podemos ter queda de performance dependendo da situação em que se utiliza.

Esse tipo de situação pode levar a um overhead no banco. Cada variável é um acesso ao disco ou memória diferente.

Existe outra forma não padronizada de declarar uma variável e atribuir valor para esta que é com select.

Gostaria de chamar atenção de vocês para a seguinte situação: veja esta query e seu resultado.

Agora, imagine que criamos um bloco de comando com duas variáveis para Nome e Sobrenome e queremos que a query retorne todos os funcionários do departamento 4. 

O que aconteceria com este resultado?!

Como podemos perceber, a query retornou apenas um resultado. isso ocorre porque quando trabalhamos com variável e múltiplas linhas de resultados, o último que for registrado é o retornado pelo SQL Server.

BATCH

Bloco de comando executado no SQL server como uma única unidade.

Não confundir batch com transação. As transações são executadas uma por vez, como uma ação unitária enquanto as batches, em blocos ou lotes.

É de se destacar que se num determinado lote de comando SQL houver falha em um dos comandos, o restante e o que já foi executado continuam, enquanto que o lote que apresentou falha retorna erro.

Veja a imagem abaixo e repare os trechos destacados. 

Percebemos que o primeiro e o terceiro bloco de comando foi executado com sucesso, apenas o segundo retornando erro. Este é um ponto muito positivo quando utilizamos batches para certos procedimentos. 

Se fosse uma transação aberta, o SQL server irá executar um rollback. Esse rollback vale para a que deu erro ou para as que foram parcialmente concluídas.

VARIÁVEIS COM BATCH

o uso de variáveis com batch não tem muita diferença do que já vimos ser utilizado no tópico de variáveis, desde que, cada lote chame a sua própria. 

Isso quer dizer que se uma variável da batch B chamar uma variável da Batch A, irá acusar erro.

Alguns comandos de criação não são executados em lotes, como por exemplo:

CREATE DEFAULT, CREATE FUNCTION, CREATE PROCEDURE, CREATE RULE, CREATE  SCHEMA, CREATE TRIGGER, and CREATE VIEW para cada um destes, é obrigatório uma execução independente. Create table é uma exceção.

Como um batch deve ser executado por vez, de forma isolada, o jeito para evitar esse erro é separando cada comando com a cláusula GO.

E mais um fato curioso sobre batches de comando. Quando executamos uma série de comandos, mesmo com a sintaxe correta e os lotes separados devidamente, o SQL Server valida cada objeto por vez, então, repare neste bloco abaixo:

Execute primeiro o bloco destacado em vermelho e depois o bloco destacado em branco.

Ainda assim, acusa erro na execução, mesmo não tendo erro de sintaxe na query. Como dito, o SQL Server valida como um todo e não por item.

A forma correta para executar o mesmo comando acima:

RESUMINDO

Neste post quis mostrar de forma introdutória com alguns conceitos como programar ações no SQL Server. Este é um assunto que vai render bastante post aqui e que iremos aprofundar muito nesse mundo de procedures, batches, triggers e variáveis!!!

Abordamos a base do assunto com as variáveis e blocos e para o próximo post, irei trazer como criar loops, controles de fluxos e IF..ELSE. 

Espero que gostem e tenha ajudado, saúde!

Aqui, o link para o script completo.