SQL Server - T-SQL Para Iniciantes


Transact-SQL ou T-SQL é uma extensão da linguagem SQL implementada pela Microsoft para o SQL Server. Ela acrescenta recursos evoluindo as seguintes características do SQL:

O T-SQL é o cerne do SQL Server. Todos os aplicativos que se comunicam com uma instância do SQL Server o fazem enviando instruções Transact-SQL ao servidor, independentemente da interface do usuário.

O Microsoft SQL Server usa palavras-chave reservadas para definir, manipular e acessar bancos de dados. As palavras-chave reservadas fazem parte da gramática da linguagem Transact-SQL usada pelo SQL Server para analisar e compreender as instruções e os lotes Transact-SQL. Embora seja sintaticamente possível usar as palavras-chave reservadas do SQL Server como identificadores e nomes de objeto em scripts Transact-SQL, você só pode fazer isso usando identificadores delimitados.

A tabela a seguir lista as palavras-chave reservadas do SQL Server: T-SQL Palavras-Chave

A seguir um resumo dos principais comandos e recursos da linguagem T-SQL.

 Usando Variáveis

A T-SQL suporta variáveis e você pode usá-las para armazenar valores.

  1. --Sintaxe:
  2. ---declaração
  3. DECLARE @variable data-type
  4. ---Atribuição
  5. SET @variavel='valor'
  6. ---Retornar valor
  7. SELECT @variavel
  8. ---Exemplo
  9. DECLARE @MeuNome varchar(20)
  10. SET @MeuNome='Macoratti'
  11. SELECT @MeuNome

Uma variável local Transact-SQL é um objeto que pode conter um valor de dados de um tipo específico. As variáveis em lotes e scripts são normalmente usadas:

Uma instrução DECLARE inicializa uma variável Transact-SQL por:

Exemplo: DECLARE @Contador int;

Quando uma variável é primeiramente declarada, seu valor é definido como NULL.

Para atribuir um valor à uma variável, use a instrução SET.

Este é o método preferido de atribuir um valor a uma variável. Uma variável também pode ter um valor atribuído sendo referenciado na lista selecionada de uma instrução SELECT.

 GO

O comando GO sinaliza o final de um lote de instruções Transact-SQL para os utilitários do SQL Server.

Sintaxe:  GO [contador]

Onde:

Contador - É um número inteiro positivo. O lote que precede GO será executado pelo número de vezes especificado.

GO não é uma instrução Transact-SQL; é um comando reconhecido pelos utilitários sqlcmd e osql e pelo Editor de códigos SQL Server Management Studio.

GO é um comando de utilitário que não exige nenhuma permissão. Pode ser executado por qualquer usuário.

Uma instrução Transact-SQL não pode ocupar a mesma linha que um comando GO.

 IF...ELSE

IF...ELSE é um controle condicional de fluxo básico usado na T-SQL.

Impõe condições na execução de uma instrução Transact-SQL. A instrução que segue uma palavra-chave IF e sua condição será executada se a condição for satisfeita: a expressão Booleana retorna TRUE.

A palavra-chave opcional ELSE introduz outra instrução que será executada quando a condição IF não for satisfeita: a expressão Booleana retorna FALSE.

Sintaxe:

IF Boolean_expression
     { sql_statement | statement_block }
[ ELSE
     { sql_statement | statement_block } ]
 

Uma construção IF...ELSE pode ser usada em lotes, em procedimentos armazenados e em consultas ad hoc. Quando essa construção é usada em um procedimento armazenado, ela normalmente é usada para testar a existência de algum parâmetro.

 BEGIN...END

Engloba uma série de instruções Transact-SQL de modo que um grupo de instruções possa ser executado.

BEGIN e END são palavras-chave da linguagem de controle de fluxo.

Sintaxe:

BEGIN
     {
        sql_statement | statement_block
     }
END

Os blocos BEGIN...END podem ser aninhados.

Embora todas as instruções Transact-SQL sejam válidas em um bloco BEGIN...END, certas instruções não devem ser agrupadas no mesmo lote ou bloco de instrução.

 WHILE

A instrução WHILE repete uma instrução ou bloco de instruções desde que a condição especificada permaneça verdadeira.

Ela define uma condição para a execução repetida de uma instrução ou um bloco de instruções SQL. As instruções serão executadas repetidamente desde que a condição especificada seja verdadeira.

A execução de instruções no loop WHILE pode ser controlada internamente ao loop com as palavras-chave BREAK e CONTINUE.

WHILE Boolean_expression 
     { sql_statement | statement_block | BREAK | CONTINUE } 

 

Boolean_expression
É uma expressão que retorna TRUE ou FALSE. Se a expressão booleana contiver uma instrução SELECT, a instrução SELECT deverá ser incluída entre parênteses.
{sql_statement | statement_block}
É qualquer instrução Transact-SQL ou agrupamento de instruções, conforme definido com um bloco de instruções. Para definir um bloco de instruções, use as palavras-chave BEGIN e END de controle de fluxo.
BREAK
Provoca uma saída do loop WHILE mais interno. Todas as instruções que apareçam depois da palavra-chave END, que marca o final do loop, serão executadas.
CONTINUE
Faz com que o loop WHILE seja reiniciado, ignorando todas as instruções depois da palavra-chave CONTINUE

 

Se dois ou mais loops WHILE estiverem aninhados, o BREAK interno será encerrado para o próximo loop mais externo. Todas as instruções após o fim da primeira execução do loop interno e o loop mais externo seguinte serão reiniciadas.

Exemplos:

1- Loop WHILE 2- Loop WHILE usando BREAK 2- Loop WHILE usando BREAK e CONTINUE

Dessa forma um programa poderá executar uma instrução BREAK se, por exemplo, não houver outras linhas a serem processadas. Uma restrição CONTINUE pode ser executada se, por exemplo, for necessário prosseguir com a execução do código.

 CASE

A expressão CASE é usada para avaliar várias condições e retornar um valor único para cada condição. Por exemplo, ela permite mostrar um valor alternativo a ser exibido dependendo do valor de uma coluna. Essa alteração nos dados é temporária. Portanto, não há nenhuma alteração permanente nos dados.

A expressão CASE consiste em:

Um uso comum da expressão CASE é substituir códigos ou abreviações por valores mais legíveis

Exemplo:

O exemplo seguinte usa a função CASE para alterar a exibição de categorias dos produtos para torná-las mais compreensíveis.

A expressão CASE tem dois formatos:

Os dois formatos dão suporte a um argumento ELSE opcional.

CASE pode ser usada em qualquer instrução ou cláusula que permita uma expressão válida.(Select,Update,Delete,etc.)

 TRANSACTION

Uma transação é uma única unidade de trabalho. Se uma transação tiver êxito, todas as modificações de dados feitas durante a transação estarão confirmadas e se tornarão parte permanente do banco de dados. Se uma transação encontrar erros e precisar ser cancelada ou revertida, todas as modificações de dados serão apagadas.

SQL Server opera nos modos de transação a seguir.

  1. Transações de confirmação automática :  Cada instrução individual é uma transação.
  2. Transações explícitas : Cada transação é iniciada explicitamente com a instrução BEGIN TRANSACTION e finalizada explicitamente com uma instrução COMMIT ou ROLLBACK.
  3. Transações implícitas :  Uma transação nova é iniciada implicitamente quando a transação anterior é concluída, mas cada transação é explicitamente concluída com uma instrução COMMIT ou ROLLBACK.
  4. Transações de escopo de lote :  Aplicável apenas a MARS (Conjuntos de Resultados Ativos Múltiplos), uma transação Transact-SQL explícita ou implícita iniciada em uma sessão MARS se torna uma transação de escopo de lote. Uma transação de escopo de lote não confirmada ou revertida, quando um lote é concluído, é revertida automaticamente pelo SQL Server

A característica de uma transação e sua diferença para uma execução em lote é que ela pode desfazer todas as operações realizada desde o início da transação usando a instrução ROLLBACK TRANSACTION.

Para indicar o início de uma transação usamos a instrução BEGIN TRANSACTION OU BEGIN TRAN

Esta instrução marca o ponto inicial de uma transação local explícita. BEGIN TRANSACTION incrementa @@TRANCOUNT em 1.

Para confirmar a execução das operações realizadas na transação usamos a instrução COMMIT TRANSACTION OU COMMIT TRAN

Esta instrução marca o término de uma transação implícita ou explícita que teve êxito. Se @@TRANCOUNT for igual a 1, COMMIT TRANSACTION transformará todas as modificações de dados executadas desde o início da transação em parte permanente do banco de dados, liberará os recursos ocupados pela transação e decrementará @@TRANCOUNT para 0. Se @@TRANCOUNT for maior que 1, COMMIT TRANSACTION decrementará @@TRANCOUNT apenas de 1 e a transação continuará ativa.

Exemplo:

O exemplo ao lado abre o banco de dados Agenda e
inicia uma transação - BEGIN TRAN

A seguir atualiza a coluna nome para 'Macorati' quando o Id for igual a 1

Depois atualiza a coluna para 'Jose Carlos Macoratti' quando o Id for igual a 1

Ao final confirmamos as operações e encerramos a transação atualizando o banco de dados com COMMIT TRAN

 

Para desfazer as operações realizadas desde o início da transação usamos a instrução ROLLBACK TRANSACTION OU ROLLBACK TRAN.

Esta instrução reverte uma transação explícita ou implícita ao começo da transação ou a um ponto de salvamento dentro da transação. Você pode usar ROLLBACK TRANSACTION para apagar todas as modificações de dados feitas desde o começo da transação ou até um ponto de salvamento. Ela também libera recursos mantidos pela transação.

Exemplo:

Suponha que, por qualquer motivo, a segunda instrução de atualização deve atualizar exatamente cinco linhas.

Se @@ROWCOUNT, que controla o número de linhas afetadas por cada instrução, for igual a cinco, a transação será confirmada caso contrário ele será cancelada.

A declaração ROLLBACK TRAN  "desfaz" todo o trabalho desde a correspondente instrução BEGIN TRAN. Ela não vai executar qualquer instrução de atualização.

Note que o Query Analyzer irá mostrar-lhe mensagens indicando que linhas foram atualizadas, mas você pode consultar o banco de dados para verificar se as modificações realmente ocorreram.

Uma instrução ROLLBACK TRANSACTION não produz nenhuma mensagem para o usuário. Se forem necessários avisos em procedimentos armazenados ou Triggers, use as instruções RAISERROR ou PRINT. RAISERROR é a instrução preferida para indicar erros.

Instruções ROLLBACK TRANSACTION em procedimentos armazenados não afetam instruções subsequentes no lote que chamou o procedimento; instruções subsequentes no lote são executadas.

Instruções ROLLBACK TRANSACTION em Triggers finalizam o lote contendo a instrução que ativou o trigger; instruções subsequentes no lote são executadas.

 Stored Procedures

Procedimento armazenado ou Stored Procedure é uma coleção de comandos SQL executados contra um banco de dados que encapsula tarefas repetitivas, aceita parâmetros de entrada e retorna um valor de status (para indicar aceitação ou falha na execução).

O procedimento armazenado pode reduzir o tráfego na rede, visto que os comandos são executados diretamente no servidor. Além de melhorar a performance, criar mecanismos de segurança entre a manipulação dos dados do Banco de Dados.

Para criar uma Stored Procedure usamos a instrução : CREATE PROCEDURE  que cria um procedimento armazenado Transact-SQL ou CLR (Common Language Runtime) no SQL Server.

Assim Procedimentos armazenados são semelhantes a procedimentos em outras linguagens de programação no sentido de que podem:

Quando um procedimento é executado pela primeira vez, ele é compilado para determinar um plano de acesso ideal para recuperar os dados. As execuções subsequentes do procedimento poderão reutilizar o plano já gerado se ele ainda estiver no cache de planos do Mecanismo de Banco de Dados.

Um ou mais procedimentos podem ser executados automaticamente quando o SQL Server é iniciado. Os procedimentos devem ser criados pelo administrador do sistema no banco de dados mestre e executados com função de servidor sysadmin como um processo de segundo plano.

A instrução CREATE PROCEDURE não pode ser combinada com outras instruções Transact-SQL em um único lote.

Exemplo:

A seguir temos um exemplo de como criar stored procedures ou procedimentos armazenados no SQL Server usando o banco de dados Clientes.mdf e a tabela Contatos.

Abra o DataBase Explorer e após expandir os objetos do banco de dados Clientes.mdf clique com o botão direito do mouse sobre o objeto Stored Procedures e selecione a opção Add New Stored Procedure;

No editor do SQL Server vamos criar a stored procedure exibeContatos que irá retornar todos os contatos cadastrados na tabela Contatos.

Digite o comando conforme ao lado e clique no botão Save para salvar
a stored procedure no banco de dados;

A instrução SQL usada é: SELECT * from Contatos

Repita o procedimento agora para criar a stored procedure SelecionaContatosPorIdade onde iremos retornar todos os contatos com idade superior a uma idade definida.

Observe que criarmos o parâmetro idade do tipo int para ser usado
na cláusula WHERE.

O comando SQL usado é :
SELECT * from Contatos WHERE idade > @ idade

Novamente repita o processo para criar a stored procedure selecionaContatosPorCidade que irá retornar os contados para uma determinada cidade;

Observe que criarmos o parâmetro cidade do tipo varchar para ser usado na cláusula WHERE.

O comando SQL usado é :
SELECT * from Contatos WHERE cidade = @ cidade

Ao final teremos as stored procedures criadas no banco de dados e prontas para uso conforme a figura abaixo:

Vimos assim um pequeno resumo dos principais conceitos da linguagem T-SQL. Em outro artigo irei abordar outros conceitos como Views, Triggers, etc.

 Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

João 6:43 Respondeu-lhes Jesus: Não murmureis entre vós.

João 6:44 Ninguém pode vir a mim, se o Pai que me enviou não o trouxer; e eu o ressuscitarei no último dia.

João 6:45 Está escrito nos profetas: E serão todos ensinados por Deus. Portanto todo aquele que do Pai ouviu e aprendeu vem a mim.

João 6:46 Não que alguém tenha visto o Pai, senão aquele que é vindo de Deus; só ele tem visto o Pai.

João 6:47 Em verdade, em verdade vos digo: Aquele que crê tem a vida eterna.

Referências:


José Carlos Macoratti