MERGE - Uma explicação melhor e detalhes

20/10/2014

0

Realiza operações de inserção, atualização ou exclusão em uma tabela de destino com base nos resultados da junção com a tabela de origem. Por exemplo, você pode sincronizar duas tabelas inserindo, atualizando ou excluindo linhas em uma tabela com base nas diferenças encontradas na outra tabela.


Me desculpem realmente, mas não consegui assimilar o que está sendo dito acima e pra piorar não entendi o t-sql.
Mariana Carvalho

Mariana Carvalho

Responder

Post mais votado

20/10/2014

O link foi erro meu, coloquei um "." no final da url: http://msdn.microsoft.com/pt-br/library/bb510625.aspx

A lógica de usar o merge é para tabelas similares, você pode colocar toda sua lógica na comparação "ON" semelhante aos JOINS e isolar certas situações:
MERGE #Tabela1 AS Destino

USING #Tabela2 AS Origem

ON Destino.Campo = Origem.Campo

William

William
Responder

Mais Posts

20/10/2014

William

Mariana, recentemente tive que migrar uma base de dados e utilizei um pouco desse MERGE, no meu caso foi bem simples.

Imagine 2 tabelas de clientes, uma no banco antigo e outra no banco novo, sendo que o banco antigo possuía vários clientes e no banco novo possuía poucos clientes, então seria necessário atualizar alguns registros e inserir outros.

TABELA CLIENTES_ANTIGA
ID - NOME - CELULAR
1 - JOÃO - 99998888
2 - PEDRO - 55554444
3 - VITOR - 52525263

TABELA CLIENTES_NOVA
ID - NOME - CELULAR
1 - JOÃO - 99998888
2 - PEDRO - 555555555

Observe a diferença de dados entre a CLIENTES_ANTIGA e a CLIENTES_NOVA:
- O registro com ID 1 é igual nas 2 tabelas então não precisa ser atualizado na clientes_nova
- O registro com ID 2 possui o número de celular diferente, posso atualizar somente o celular na clientes _nova
- O registro com ID 3 existe na clientes_antiga, mas não existe na clientes_nova, nesse caso posso inserir ele na clientes_nova

Você pode excluir registros também!

Quanto a semântica dos comandos, segue documentação da microsoft: http://msdn.microsoft.com/pt-br/library/bb510625.aspx.
Responder

20/10/2014

Mariana Carvalho

Sabe William, tenho medo quando vejo situações assim, não no seu exemplo que foi simples para me mostrar como funciona, que deu para entender perfeitamente, mas te faço uma pergunta sobre uma possivel situação, quando nas duas tabelas existirem o mesmo ID, o que fazer?
Responder

20/10/2014

Mariana Carvalho

Não consegui acessar o link:

Server Error in '/' Application.
Responder

20/10/2014

Mariana Carvalho

Eu estava tentando entender nesse link mesmo, esses t-sql em grande quantidade. vou tentar testar aqui esse exemplo que colocou.
Responder

21/10/2014

Mariana Carvalho

bom, tentei, mas acho que não entendi bem...


CREATE DATABASE TESTE_MERGE;

USE TESTE_MERGE;

CREATE TABLE CLIENTES_ANTIGA(
	ID INT PRIMARY KEY,
	NOME VARCHAR,
	TELEFONE INT 
);

CREATE TABLE CLIENTES_NOVA(
	ID INT PRIMARY KEY,
	NOME VARCHAR,
	TELEFONE INT 
);

INSERT INTO CLIENTES_ANTIGA (ID, NOME, TELEFONE) VALUES (1, 'M', 23324455);
INSERT INTO CLIENTES_ANTIGA (ID, NOME, TELEFONE) VALUES (2, 'S', 23324455);
INSERT INTO CLIENTES_ANTIGA (ID, NOME, TELEFONE) VALUES (3, 'R', 23324455);

INSERT INTO CLIENTES_NOVA(ID, NOME, TELEFONE) VALUES (1, 'M', 55555555);
INSERT INTO CLIENTES_NOVA (ID, NOME, TELEFONE) VALUES (2, 'S', 44444);


MERGE #Tabela1 AS CLIENTES_ANTIGA
 
USING #Tabela2 AS CLIENTES_NOVA
 
ON CLIENTES_NOVA.NOME = CLIENTES_ANTIGA.NOME

Responder

21/10/2014

William

Faltou informar as ações que devem ser executadas conforme as comparações, nesse link você encontra exemplos mais concretos: http://sqlgo.wordpress.com/2011/04/23/usando-o-comando-merge/
Responder

21/10/2014

Mariana Carvalho

Está bem William, irei testar, mas só amanha agora. obrigada.
Responder

23/10/2014

Mariana Carvalho

Retornando, me desculpe fiquei sem entender e como implementar no exemplo que descrevi acima


– Há registro no destino e na origem

WHEN MATCHED

THEN UPDATE SET Ativo = 0, Alteracao = GETDATE()

–Quando não há registro no destino e há na origem

WHEN NOT MATCHED

THEN INSERT (Nome, Cadastro, Ativo) VALUES (Origem.Nome, Getdate(),1)

–Quando  há registro no destino mas não há na origem

–e que sejam diferente de João
 

WHEN NOT MATCHED BY SOURCE AND Nome <>‘Joao’

THEN UPDATE SET Ativo = NULL, Alteracao = GETDATE();



SELECT * FROM #Tabela1

SELECT * FROM #Tabela2

Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar