Array
(
)

MERGE - Uma explicação melhor e detalhes

Mariana Carvalho
   - 20 out 2014


Citação:
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.

William (devwilliam)
   - 20 out 2014

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.

Mariana Carvalho
   - 20 out 2014

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?

Mariana Carvalho
   - 20 out 2014

Não consegui acessar o link:

Server Error in '/' Application.

William (devwilliam)
   - 20 out 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:
#Código

MERGE #Tabela1 AS Destino

USING #Tabela2 AS Origem

ON Destino.Campo = Origem.Campo

Mariana Carvalho
   - 20 out 2014

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

Mariana Carvalho
   - 21 out 2014

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

#Código


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

William (devwilliam)
   - 21 out 2014

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/

Mariana Carvalho
   - 21 out 2014

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

Mariana Carvalho
   - 23 out 2014

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

#Código


– 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