terça-feira, 28 de outubro de 2014

Como deletar linhas repetidas SQL Server de maneira fácil

Quem não precisou ainda certamente um dia vai precisar...
Apagar  linhas repetidas SQL Server usando CTE (Commom Table Expressions) é um jeito rápido e muito simples!
Vamos lá:


-- Cria uma tabela que terá as linhas duplicadas
Create Table Funcionarios (Id Int, Nome Varchar(100), Departmento Varchar(50))

-- Insere dados duplicados na tabela (Ids 1 e 4)
insert into Funcionarios values (1, 'João', '.Net')
insert into Funcionarios values (2, 'Arnaldo', '.NET')
insert into Funcionarios values (3, 'Alexandre', 'PHP')
insert into Funcionarios values (4, 'João', '.NET')
insert into Funcionarios values (5, 'Carlos', 'Designer')

-- Lista os registros repetidos considerando as colunas Nome e Departamento
With tblTemp as
(
Select ROW_NUMBER() Over(PARTITION BY Nome, Departmento ORDER BY Nome)
   As RowNumber,* FROM Funcionarios
)
-- Apaga as linhas repetidas, deixando apenas uma delas
Delete From tblTemp Where RowNumber >1

--Apaga a tabela de testes

Drop Table Funcionarios


Fácil né? Sem copias de tabelas, agrupamentos e etc.

quarta-feira, 10 de setembro de 2014

Zerar coluna identity SQL Server (Reset Identity)

Algumas vezes é preciso zerar os dados de uma tabela no SQL Server, e para não perder a sequência de IDs, as vezes também é preciso zerar o identity.

Ao invés de recriar a tabela, o simples comando CHECKIDENT pode fazer isso.

Funciona assim:

DBCC CHECKIDENT('NomeDaTabela', RESEED, 0)

Onde:

  • 'NomeDaTabela' é o nome da tabela que terá o identity reiniciado;
  • RESEED é o comando para reiniciar o identity;
  • 0 é o número para o qual você quer que a contagem recomece, no caso zero. Caso queira voltar para outro número, basta indicá-lo.
Nota: Neste exemplo o próximo número do identity será 1, caso queria que seja 101 por exemplo, atribua o valor 100.

Vamos ao exemplo?

1º) Vamos criar uma tabela de funcionários com identity na coluna Id [Funcionarios]:


CREATE TABLE [dbo].[Funcionarios](
[Id] [int] IDENTITY(1,1) NOT NULL, --Indica que a coluna será incremental de 1
[Nome] [varchar](100) NULL,
[Email] [varchar](200) NULL
 CONSTRAINT [PK_Usuario] PRIMARY KEY CLUSTERED (Id) 
)


2º) Vamos inserir alguns registros na tabela de funcionários:

INSERT INTO Funcionarios VALUES ('Ronaldo Luís Nazário de Lima', 'ronaldo.nazario@exemplo.com.br')
INSERT INTO Funcionarios VALUES ('David Luiz', 'david.luiz@exemplo.com.br')
INSERT INTO Funcionarios VALUES ('Edson Arantes do Nascimento', 'edson.pele@exemplo.com.br')

3º) Vamos checar os ids dos registros inseridos:

4º) Vamos checar o identity atual da tabela, utilizando o mesmo comando RESEED mas sem passar o parâmetro numérico.



5º) Vamos deletar os registros e fazer uma nova inserção, que terá o ID 4:

DELETE FROM [Funcionarios]
INSERT INTO Funcionarios VALUES ('Ronaldo Luís Nazário de Lima', 'ronaldo.nazario@exemplo.com.br')


6º) Como não queremos que a tabela comece do id 4, vamos apagar os registros novamente e zerar o seu Id:
DELETE FROM [Funcionarios]

DBCC CHECKIDENT('[Funcionarios]', RESEED, 0) --Repita o comando, porque na 1ª vez o SQL vai mostrar o identity atual

INSERT INTO Funcionarios VALUES ('Ronaldo Luís Nazário de Lima', 'ronaldo.nazario@exemplo.com.br')

SELECT * FROM [Funcionarios]




E é assim que é possível zerar o identity das tabelas do SQL Server.

Útil principalmente quando há revisão em dados e deseja manter Ids iguais entre diferentes ambientes, como de desenvolvimento e produção por exemplo.