Guia Prático de SQL Server: Comandos, Funções e Cursores

Enviado por Elvis Venancio e classificado em Inglês

Escrito em em português com um tamanho de 4,77 KB

Comandos DML Básicos

INSERT INTO tabela VALUES ('valor1', valor2, valorn)

DELETE FROM tabela WHERE condição

UPDATE tabela SET campo1 = valor1 WHERE condição

SELECT FROM tabela WHERE condição GROUP BY campo(s)
HAVING condição ORDER BY campo(s)

SELECT REPLICATE(nome, 2) FROM Cliente

Operadores e Funções de Agregação

BETWEEN / LIKE / IN / DISTINCT / TOP / ORDER BY

COUNT / SUM / AVG / MAX / MIN

Tipos de JOIN

INNER JOIN, FULL JOIN, RIGHT JOIN, LEFT JOIN

Subconsulta no SELECT

SELECT setores.*, (SELECT COUNT(*) FROM funcionarios WHERE funcionarios.setor_id = setores.setor_id) AS "Total de Funcionários" FROM setores

Tabela Temporária

SELECT * INTO #TabTemp FROM funcionarios

Variáveis e Estruturas Condicionais

DECLARE @qtd INT
SET @qtd = (SELECT SUM(quantidade) FROM Midias)

IF @qtd > 20
PRINT 'Pode abrir a locadora'
ELSE
BEGIN
PRINT 'Acho que você....'
PRINT 'Terá que comprar mais filmes...'
END

CASE WHEN

SELECT func_nome, func_salario,
CASE
WHEN func_salario >= 0 AND func_salario <= 500 THEN 'Assalariado'
WHEN func_salario > 500 AND func_salario <= 2000 THEN 'Salário padrão'
WHEN func_salario > 2000 THEN 'Cargo de confiança'
ELSE 'Salário negativo!!!!???'
END AS "Situação"
FROM funcionarios

Stored Procedures

CREATE PROCEDURE sp_calcula
(
@valor1 INT,
@valor2 INT,
@resultado INT OUTPUT
)
AS
BEGIN
SET @resultado = @valor1 + @valor2
END

DECLARE @resultado INT
EXECUTE sp_calcula 5, 7, @resultado OUTPUT
PRINT 'Resultado: ' + CAST(@resultado AS VARCHAR)

Triggers

CREATE TRIGGER trg_onInsertValue ON Funcionarios
FOR INSERT
AS
BEGIN
IF (SELECT COUNT(*) FROM inserted) = 1
PRINT 'Registro inserido com sucesso!!!'
IF (SELECT COUNT(*) FROM inserted) > 1
BEGIN
PRINT 'Impossível incluir mais de 1 funcionário por vez'
ROLLBACK TRAN
END
END

Observação: INSERTED e DELETED são tabelas virtuais disponíveis dentro de triggers.

Funções com Retorno de Tabela

CREATE FUNCTION fnc_RetornaTabelaFuncionarios
(
@p_salario_inicial DECIMAL(10,2),
@p_salario_final DECIMAL(10,2)
)
RETURNS TABLE
AS
RETURN
(
SELECT * FROM funcionarios
WHERE func_salario BETWEEN @p_salario_inicial AND @p_salario_final
)

SELECT *
FROM dbo.fnc_RetornaTabelaFuncionarios(500, 1000)
WHERE gerente_id = 1

Cursores

Cursor básico

DECLARE @func_nome VARCHAR(50)

DECLARE cursor_teste CURSOR FOR
SELECT func_nome FROM funcionarios WHERE func_nome LIKE '%d%'

OPEN cursor_teste

FETCH NEXT FROM cursor_teste INTO @func_nome
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT 'Nome: ' + @func_nome
FETCH NEXT FROM cursor_teste INTO @func_nome
END
CLOSE cursor_teste
DEALLOCATE cursor_teste

Cursor com atualização

DECLARE @func_id INT
DECLARE @func_nome VARCHAR(50)
DECLARE cursor_teste CURSOR FOR SELECT func_id, func_nome FROM funcionarios
OPEN cursor_teste
FETCH NEXT FROM cursor_teste INTO @func_id, @func_nome
WHILE @@FETCH_STATUS = 0
BEGIN
IF CHARINDEX('k', @func_nome) != 0
BEGIN
SET @func_nome = @func_nome + ' Souza' -- se tiver a letra k no nome
UPDATE funcionarios
SET func_nome = @func_nome
WHERE CURRENT OF cursor_teste
END
PRINT CAST(@func_id AS VARCHAR(5)) + ' ' + @func_nome
FETCH NEXT FROM cursor_teste INTO @func_id, @func_nome
END
CLOSE cursor_teste
DEALLOCATE cursor_teste

Cursor SCROLL (percorrendo de trás para frente)

DECLARE @func_id INT
DECLARE @func_nome VARCHAR(50)
DECLARE cursor_teste SCROLL CURSOR FOR
SELECT func_id, func_nome FROM funcionarios
OPEN cursor_teste
FETCH LAST FROM cursor_teste INTO @func_id, @func_nome
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT CAST(@func_id AS VARCHAR(5)) + ' ' + @func_nome
FETCH PRIOR FROM cursor_teste INTO @func_id, @func_nome
END
CLOSE cursor_teste
DEALLOCATE cursor_teste

Entradas relacionadas: