Módulo 2 · SQL Server / Procedures — Capítulo 01

Revisão Rápida de T-SQL

Antes de escrever a primeira procedure, um raio-x rápido do T-SQL: as instruções que toda procedure vai usar por dentro.

1. O que é T-SQL

T-SQL (Transact-SQL) é o dialeto de SQL usado pelo SQL Server — um superset do SQL padrão (ANSI) com adições próprias: variáveis, controle de fluxo (IF, WHILE), tratamento de erro (TRY/CATCH) e funções específicas da plataforma. É a linguagem que vai viver dentro de toda Stored Procedure deste curso.

Por que revisar isso agora

Você já usa SQL Server há 3 anos, então este capítulo não é uma introdução do zero — é um checkpoint rápido dos comandos que reaparecem dentro de toda procedure, para garantir que os próximos capítulos (que assumem isso como pré-requisito) não tenham lacunas.

2. DDL — definindo a estrutura

DDL (Data Definition Language) é o grupo de comandos que cria e altera objetos do banco: CREATE, ALTER, DROP.

SQL criando a tabela de apoio deste módulo
CREATE TABLE dbo.Cliente
(
    Id            INT IDENTITY(1,1) PRIMARY KEY,
    Nome          NVARCHAR(100)  NOT NULL,
    Email         NVARCHAR(150)  NOT NULL,
    Ativo         BIT            NOT NULL DEFAULT 1,
    DataCadastro  DATETIME2      NOT NULL DEFAULT SYSDATETIME()
);
CláusulaPapel
IDENTITY(1,1)Auto-incremento começando em 1, passo 1 — equivalente ao SERIAL/autoincrement de outros bancos.
PRIMARY KEYChave primária — identificador único da linha.
NOT NULLColuna obrigatória.
DEFAULTValor usado quando nenhum é informado no INSERT.

3. DML — manipulando dados

DML (Data Manipulation Language) é o grupo que você vai escrever dentro de praticamente toda procedure: SELECT, INSERT, UPDATE, DELETE.

SQL os quatro comandos essenciais
-- SELECT: ler dados
SELECT Id, Nome, Email
FROM dbo.Cliente
WHERE Ativo = 1
ORDER BY Nome;

-- INSERT: criar uma linha
INSERT INTO dbo.Cliente (Nome, Email)
VALUES ('Wellington Marunaka', 'wellington@exemplo.com');

-- UPDATE: alterar linhas existentes
UPDATE dbo.Cliente
SET Ativo = 0
WHERE Id = 3;

-- DELETE: remover linhas
DELETE FROM dbo.Cliente
WHERE Ativo = 0 AND DataCadastro < '2020-01-01';
Atenção

UPDATE e DELETE sem WHERE afetam a tabela inteira. Isso vale tanto quanto rodando direto no SSMS quanto dentro de uma procedure — uma procedure mal escrita é tão perigosa quanto uma query solta.

4. JOIN — combinando tabelas

Praticamente toda procedure de leitura combina duas ou mais tabelas. Os quatro tipos de JOIN mais usados:

JOINRetorna
INNER JOINSó linhas que têm correspondência nas duas tabelas.
LEFT JOINTodas as linhas da tabela da esquerda, com NULL quando não há correspondência à direita.
RIGHT JOINO espelho do LEFT JOIN — todas as linhas da direita.
FULL OUTER JOINTodas as linhas de ambos os lados, casando onde possível.
SQL exemplo de INNER JOIN e LEFT JOIN
CREATE TABLE dbo.Pedido
(
    Id         INT IDENTITY(1,1) PRIMARY KEY,
    ClienteId  INT NOT NULL REFERENCES dbo.Cliente(Id),
    Valor      DECIMAL(10,2) NOT NULL,
    DataPedido DATETIME2 NOT NULL DEFAULT SYSDATETIME()
);

-- Só clientes que já fizeram pedido
SELECT c.Nome, p.Valor, p.DataPedido
FROM dbo.Cliente c
INNER JOIN dbo.Pedido p ON p.ClienteId = c.Id;

-- Todos os clientes, mesmo sem nenhum pedido (Valor vem NULL)
SELECT c.Nome, p.Valor
FROM dbo.Cliente c
LEFT JOIN dbo.Pedido p ON p.ClienteId = c.Id;

5. Variáveis e controle de fluxo

Isso é o que separa T-SQL de SQL "puro" — e é a base de toda procedure a partir do próximo capítulo. Variáveis começam com @, são declaradas com DECLARE e atribuídas com SET ou SELECT:

SQL variáveis e IF/WHILE
DECLARE @TotalClientes INT;
SET @TotalClientes = (SELECT COUNT(*) FROM dbo.Cliente);

IF @TotalClientes > 100
BEGIN
    PRINT 'Base grande';
END
ELSE
BEGIN
    PRINT 'Base pequena';
END

-- Laço simples
DECLARE @Contador INT = 1;
WHILE @Contador <= 3
BEGIN
    PRINT 'Iteração ' + CAST(@Contador AS VARCHAR(10));
    SET @Contador = @Contador + 1;
END

Pense em DECLARE como o let/var do T-SQL: define o nome e o tipo. É exatamente esse par — variável tipada + controle de fluxo — que vira o "corpo" de uma procedure no próximo capítulo.

6. Funções de agregação e agrupamento

SQL GROUP BY e agregações
SELECT c.Id, c.Nome, COUNT(p.Id) AS TotalPedidos, SUM(p.Valor) AS ValorTotal
FROM dbo.Cliente c
LEFT JOIN dbo.Pedido p ON p.ClienteId = c.Id
GROUP BY c.Id, c.Nome
HAVING COUNT(p.Id) > 0
ORDER BY ValorTotal DESC;
Dica

WHERE filtra linhas antes de agrupar; HAVING filtra depois do GROUP BY, operando sobre o resultado agregado (como COUNT ou SUM). É por isso que WHERE COUNT(p.Id) > 0 não compila, mas HAVING COUNT(p.Id) > 0 sim.

7. Onde isso te leva

Com DDL, DML, JOINs, variáveis e controle de fluxo revisados, você já tem tudo que uma Stored Procedure usa por dentro. O próximo capítulo (que você já viu no piloto) parte exatamente daqui para formalizar a sintaxe de CREATE PROCEDURE.

📌 Resumo do capítulo

  • DDL (CREATE/ALTER/DROP) define estrutura; DML (SELECT/INSERT/UPDATE/DELETE) manipula dados.
  • INNER JOIN exige correspondência dos dois lados; LEFT JOIN mantém tudo do lado esquerdo mesmo sem correspondência.
  • Variáveis T-SQL começam com @, declaradas com DECLARE — a mesma sintaxe usada dentro de procedures.
  • WHERE filtra antes do agrupamento; HAVING filtra depois.

✏️ Praticando

  1. Crie as tabelas Cliente e Pedido deste capítulo.
  2. Escreva uma query com LEFT JOIN que liste todos os clientes e a quantidade de pedidos de cada um (0 para quem não tem nenhum).
  3. Escreva um bloco com DECLARE + WHILE que insira 5 clientes de teste numerados (Cliente 1, Cliente 2...).