MERGE - Uma explicação melhor e detalhes
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
Curtidas 1
Melhor post
William
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:
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
GOSTEI 2
Mais Respostas
William
20/10/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.
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.
GOSTEI 1
Mariana Carvalho
20/10/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?
GOSTEI 1
Mariana Carvalho
20/10/2014
Não consegui acessar o link:
Server Error in '/' Application.
Server Error in '/' Application.
GOSTEI 0
Mariana Carvalho
20/10/2014
Eu estava tentando entender nesse link mesmo, esses t-sql em grande quantidade. vou tentar testar aqui esse exemplo que colocou.
GOSTEI 0
Mariana Carvalho
20/10/2014
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
GOSTEI 1
William
20/10/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/
GOSTEI 0
Mariana Carvalho
20/10/2014
Está bem William, irei testar, mas só amanha agora. obrigada.
GOSTEI 0
Mariana Carvalho
20/10/2014
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
GOSTEI 0