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.
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.
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áusula | Papel |
|---|---|
IDENTITY(1,1) | Auto-incremento começando em 1, passo 1 — equivalente ao SERIAL/autoincrement de outros bancos. |
PRIMARY KEY | Chave primária — identificador único da linha. |
NOT NULL | Coluna obrigatória. |
DEFAULT | Valor 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.
-- 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';
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:
| JOIN | Retorna |
|---|---|
INNER JOIN | Só linhas que têm correspondência nas duas tabelas. |
LEFT JOIN | Todas as linhas da tabela da esquerda, com NULL quando não há correspondência à direita. |
RIGHT JOIN | O espelho do LEFT JOIN — todas as linhas da direita. |
FULL OUTER JOIN | Todas as linhas de ambos os lados, casando onde possível. |
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:
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
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;
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.