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 SpoltiMuito 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
- Diferenças entre SEQUENCES x IDENTITY no Microsoft SQL Server 2012SQL
- Utilizando FILETABLE no SQL Server 2012SQL Server
- Utilizando SEQUENCES no Microsoft SQL Server 2012SQL
- Exportação de dados do SQL Server para o Oracle com assistente de importação do SQL ServerSQL
- Tunning Index com o DTASQL