Array
(
)

Como juntar dois bancos de dados em um só?

Marcelo Neiva
   - 23 mar 2015

Olá.
Tenho dois Bancos de dados com a mesma estrutura. BD1 e BD2
Preciso passar todos os dados do BD2 para o BD1
Porém, existem dados iguais(com mesmo ID) do BD2 que contém no BD1
Alguém sabe como fazer?
(acredito que seria como se fosse uma replicação entre bancos)
Obs: Utilizo o SQL 2012 Enterprise

Fabiano Carvalho
   - 23 mar 2015

É somente UMA TABELA, ou todas as tabelas?
Se for uma unica tabela basta utilizar LEFT JOIN.

Thiago Santana
   - 23 mar 2015

Marcelo, seria apenas uma consulta nos 2 bancos ou você deseja efetuar a junção de dados em um único?

Marcelo Neiva
   - 23 mar 2015

Várias tabelas, cerca de 70% delas

Marcelo Neiva
   - 23 mar 2015

Efetuar a junção de dados em um único, que pode ser no BD1 por exemplo.

Marcos P
   - 23 mar 2015

Acredito que você tenha de fazer isso tabela-a-tabela...

Como existem chaves primárias que se repetem nos dois bancos, você terá de criar uma terceira tabela de destino e fazer o JOIN das duas no momento do insert.

Serão geradas novas chaves primárias... se isso for um problema, terá de ser criada uma nova coluna que irá compor a chave primária da nova tabela, apenas "desempatando" pela origem dos dados.

Algo como :

#Código
Tabela.DB1 Tabela.DB2 NovaTabelaDB1
---------------- ---------------- ----------------
ID ColunaA ID ColunaA ID ColunaA
---------------- ---------------- ----------------
1 ABC 1 XYZ 1 ABC
2 BCD 2 XXX 2 BCD
3 FDH 3 YYY 3 FDH
4 AAA 4 ZZZ 4 AAA
5 BHU 5 WKL 5 BHU
: : 6 XYZ
7 XXX
8 YYY
9 ZZZ
10 WKL
:


ou

#Código
Tabela.DB1 Tabela.DB2 NovaTabelaDB1
---------------- ---------------- ----------------
ID ColunaA ID ColunaA ID Origem ColunaA
---------------- ---------------- ----------------
1 ABC 1 XYZ 1 DB1 ABC
2 BCD 2 XXX 2 DB1 BCD
3 FDH 3 YYY 3 DB1 FDH
4 AAA 4 ZZZ 4 DB1 AAA
5 BHU 5 WKL 5 DB1 BHU
: : 1 DB2 XYZ
2 DB3 XXX
3 DB4 YYY
4 DB5 ZZZ
5 DB6 WKL
:


Existe, também, a possibilidade de derrubar toda arquitetura de chaves-primárias, mas imagino que isso seja um transtorno muito grande do lado da aplicação.

Marcos P
   - 23 mar 2015

Em tempo, corrigindo o segundo exemplo :

#Código
Tabela.DB1 Tabela.DB2 NovaTabelaDB1
---------------- ---------------- ----------------
ID ColunaA ID ColunaA ID Origem ColunaA
---------------- ---------------- ----------------
1 ABC 1 XYZ 1 DB1 ABC
2 BCD 2 XXX 2 DB1 BCD
3 FDH 3 YYY 3 DB1 FDH
4 AAA 4 ZZZ 4 DB1 AAA
5 BHU 5 WKL 5 DB1 BHU
: : 1 DB2 XYZ
2 DB2 XXX
3 DB2 YYY
4 DB2 ZZZ
5 DB2 WKL
:

Marcos P
   - 23 mar 2015

Você pode, ainda, guardar ( como uma coluna normal ) a chave da origem na nova tabela ( para uso futuro ) :

#Código
Tabela.DB1 Tabela.DB2 NovaTabelaDB1
---------------- ---------------- -------------------
ID ColunaA ID ColunaA ID OLD_ID Coluna
---------------- ---------------- ------------------
1 ABC 1 XYZ 1 1 ABC
2 BCD 2 XXX 2 2 BCD
3 FDH 3 YYY 3 3 FDH
4 AAA 4 ZZZ 4 4 AAA
5 BHU 5 WKL 5 5 BHU
: : 6 1 XYZ
7 2 XXX
8 3 YYY
9 4 ZZZ
10 5 WKL
:

Marcos P
   - 23 mar 2015

E aí Marcelo, resolveu ?

Precisa de ajuda com as queries ?

Marcelo Neiva
   - 01 jun 2015

Na verdade não fiz, gostaria de um exemplo (T-SQL) mais prático para juntar os 2 BDs.
Em relação aos IDs, daria um UPDATE em cada tabela para o ID necessário, eu teira esses IDs ao criar o Usuário no sistema, não teria problema neste caso.

Marcos P, apesar de sua técnica/ideia ser boa, talvez eu poderia pensar um forma melhor, mas acredito que não resolveria o meu problema.
Valeu pela dica!

Abraços,

Marcelo.

Mariana Carvalho
   - 01 jun 2015

Gente me metendo aqui, fiquei curiosa com a situação, nessa situação especifica existe um t-sql ou alguma forma simples, utilizado um software extra para importação.

Fabiano Carvalho
   - 01 jun 2015

Se for 2008 tente utilizar merge

Mariana Carvalho
   - 01 jun 2015

Fabiano, pode demonstrar um T-SQL mais simples que desse link?

https://msdn.microsoft.com/pt-br/library/bb510625.aspx

Mariana Carvalho
   - 02 jun 2015

Não esquece Fabiano.

Fabiano Carvalho
   - 02 jun 2015

Veja se fica compreensivel.

#CódigoMERGE DESTINO AS DESTINO
USING FONTE AS FONTE
ON DESTINO.INDICE = FONTE.DESTINO

WHEN MATCHED --Quando encontrar
UPDATE SET ENCONTROU = 'SIM' --ATUALIZA A COLUNA ENCONTROU

WHEN NOT MATCHED
UPDATE SET ENCONTROU = 'NAO' --ATUALIZA A COLUNA NAO ENCONTROU

Mariana Carvalho
   - 02 jun 2015

Muitissimo obrigada Fabiano.