Desenvolvimento - SQL

Melhoramentos no T-SQL do SQL Server 2005 - Cláusula TOP e Cláusula OUTPUT

Muito se fala das grandes novidades que o SQL Server 2005 estará nos proporcionando, vamos cobrir neste artigo algumas alterações sutis no T-SQL , mas que podem nos trazer uma grande gama de possibilidades.

por Eugênio Spolti



Cláusula TOP

Muito se fala das grandes novidades que o SQL Server 2005 estará nos proporcionando, vamos cobrir neste artigo algumas alterações sutis no T-SQL , mas que podem nos trazer uma grande gama de possibilidades.

A cláusula TOP sempre teve a precariedade de não poder ser definido o número de registros o percentual dinâmicamente, mas como dizem o pessoal do Casseta "seus problemas se acabarão-se" .

Na nova versão do SQL a cláusula TOP teve algums pequenos ajustes, como o a correção da limitação descrita antes e a possíbilidade de ser utilizada também com os comandos INSERT, UPDATE e DELETE.

Temos então a nova sintaxe do TOP, lembrando que a opção sem os parênteses continuará funcionando:

     TOP (expression) [PERCENT] [ WITH TIES ]

Vamos então por a mão na massa e começar a utilizar. Vamos criar uma table e inserir alguns registros para os nossos testes:

CREATE TABLE Funcionarios
(Id INT IDENTITY, Nome VARCHAR(30))

INSERT INTO Funcionarios Values ("João Manoel")
INSERT INTO Funcionarios Values ("Jose Augusto")
INSERT INTO Funcionarios Values ("Jonas Silva")
INSERT INTO Funcionarios Values ("Pedro Alves")

A Forma mais simples do TOP é a seguinte :

Select TOP(3) * from Funcionarios

Depois temos as outras variações:

-- Duplicamos alguns registros usando o insert
Insert TOP(3) into Funcionarios 
Select * from Funcionarios

Select * friom Funcionarios


-- Somente atualiza o primeiro registro
Update TOP(1) Funcionarios set Nome = "Despedido " + Nome
Select * from Funcionarios


-- Deleta os dois primeiros registros
Delete TOP(2) from Funcionarios
Select * from Funcionarios

Agora vamos a mudança principal do TOP que é definir dinâmicamente o número de registros:

  • Podemos utilizar uma variável

    Declare @NumReg as int
    Set @NumReg = 2
    Select Top(@NumReg) from Funcionarios

  • Utilizar uma subquery para buscar nosso valor para o TOP:

    Create table Teste ( NumReg Int null)
    Insert into Teste values (3)
    Select TOP(select NumReg from Teste) * from Funcionarios

Cláusula OUTPUT

A cláusula OUTPUT nas versões anteriores ao SQL Server 2005 era somente para ser utilizada em procedures, agora foi incluído uma nova funcionalidade para OUTPUT, não para procedures, mas para os comandos DML INSERT,UPDATE e DELETE.

O objetivo desta nova funcionalidade é para suprir a necessidade de se verificar o que foi modificado pelos comandos DML, somente utilizando triggers era possível verificar o que tinha sido alterado. A cláusula OUTPUT vai trabalhar junto com as tabelas virtuais inserted e deleted, igualmente como era nas triggers.

OUTPUT deverá ser utilizada junto com a cláusula INTO para ser possível popular uma tabela. Então vamos parar de escrever e ir aos exemplos. Vamos utilizar as mesmas tabelas que foram criadas nos exemplos acima:

-- Declaramos uma variável do tipo table para ser populada
DECLARE @Deletados AS TABLE (Id INT, Nome VARCHAR(30))

DELETE Funcionarios
OUTPUT DELETED.Id, DELETED.Nome INTO @Deletados
WHERE Id < 2

SELECT * FROM @Deletados

Exatamente como nas triggers de update , o comando irá produzir as tabelas inserted e deleted:

-- Declaramos a variável do tipo table para ser populada
DECLARE @Valores TABLE (Id INT, NomeAntigo VARCHAR(30), NomeNovo VARCHAR(30))

UPDATE Funcionarios SET Nome = "Demitido " + Nome
OUTPUT inserted.Id, deleted.Nome, inserted.Nome INTO @Valores WHERE Id  = 3

SELECT * FROM @Valores

Esta cláusula poder ser muito útil quando estivermos validando algums comandos , sem precisarmos criar triggers auxiliares para isso.

Obviamente irão surgir novas idéias para a utilização destas opções, e espero ter despertado nos leitores a curiosidade de implementar ou simplismente testar estas pequenas modificações que a nova versão do SQL Server nos disponibilizará.

Um abraço e até a próxima

Eugênio Spolti

Eugênio Spolti

Eugênio Spolti - MCP em SQL Server 2000 e trabalha com banco de dados a 5 anos na Serviplan Serviços de Planejamento, empresa que presta serviços de Planejamento e BI.