T-SQL – Mesclando dados
O SQL Server 2008 trouxe para o T-SQL um comando brilhante que realmente facilita a vida de muita gente; o comando em questão é o MERGE. A idéia deste comando é mesclar dados, logo você pode comparar duas tabelas e utilizar o comando MERGE para sincronizá-las.
Vamos a um exemplo simples:
Primeiro criamos duas tabelas com estrutura idêntica. A chave primária destas tabelas é o campo CPF:
create table Tabela1 ( Nome varchar(50), Idade int, CPF char(11) primary key); create table Tabela2 ( Nome varchar(50), Idade int, CPF char(11) primary key);
Agora inserimos dados nas tabelas. Observe que os dados estão diferentes, alguns tem diferença no nome, outros registros estão sobrando ou faltando em ambas tabelas:
insert into Tabela1 values
('Silas Mendes' , 29, '08148338716'),
('Maria José' , 49, '55978913269'),
('Pedro Ribeiro', 53, '05899714732'),
('Joana Silva' , 18, '74105689623');
insert into Tabela2 values
('SILAS Mendes' , 29, '08148338716'),
('Maria Jose' , 49, '55978913269'),
('Pedro Ribeiro Souza', 53, '05899714732'),
('Carlos Mania' , 19, '12345678999');
Agora precisamos sincronizar as tabelas, vamos analisar passo-a-passo a construção do comando MERGE (o comando completo está disponível no fim do texto) .
A tabela de destino (target) é a tabela2; a tabela de origem (source) é a tabela1. A chave primária das tabelas será utilizada na comparação:
merge into tabela2 as target using (select nome, idade, cpf from tabela1) as source (nome, idade, cpf) on (target.cpf = source.cpf)
Quando os números dos CPFs forem encontrados em ambas tabelas então atualizamos os dados na tabela alvo (target):
when matched then update set target.nome = source.nome, target.idade = source.idade, target.cpf = source.cpf
Quando os números dos CPFs não forem encontrados na tabela de destino, então inserimos os dados da tabela de origem:
when not matched by target then insert (nome, idade, cpf) values (nome, idade, cpf)
E finalmente, quando existirem números de CPFs no destino que não existem na origem, apagamos os registros que sobram:
when not matched by source then delete;
Veja o código completo do comando MERGE:
merge into tabela2 as target using (select nome, idade, cpf from tabela1) as source (nome, idade, cpf) on (target.cpf = source.cpf) -- Atualiza registros diferentes when matched then update set target.nome = source.nome, target.idade = source.idade, target.cpf = source.cpf -- Insere registros que não existem no destino when not matched by target then insert (nome, idade, cpf) values (nome, idade, cpf) -- Se existir no destino e não existir na origem é apagado when not matched by source then delete;
Por fim realizamos o SELECT nas duas tabelas para verificar o resultado após a sincronização:
select * from Tabela1; select * from Tabela2;
