Atualizar campo usando bancos de dados diferentes.
-
terça-feira, 10 de abril de 2012 18:39
Olá, eu tenho o banco teste e banco produção, vamos chamar de BD_PRD e BD_TESTE, ambos possuem o campo status. O que preciso é, atualizar o campo status do banco produção usando as informações do mesmo campo só que no banco teste. Como não sei bem usar join, estou tentando fazer desta forma. Alguém pode me ajudar?
Como nem tudo que tem cadastrado na base produção é exatamente algual na base teste, tenho que olhar antes se o código do item é igual entre os dois bancos para então depois fazer o update.
BEGIN
FOR CUR1 IN (SELECT * FROM BD_PRD.DBO.CAT2020 A WHERE
EXISTS(SELECT 1 FROM BD_TESTE.DBO.CAT2020 B WHERE A.CODIGO=B.CODIGO))
loop
update BD_TESTE.DBO.CAT2020 set O1_STATUS = CUR1.O1_STATUS
where
CODIGO=CUR1.CODIGO;
end loop;
commit;
end;- Editado Letícia6 terça-feira, 10 de abril de 2012 18:40
- Movido Gustavo Maia AguiarMVP, Moderator terça-feira, 10 de abril de 2012 19:41 (De:SQL Server - Infra Geral)
Todas as Respostas
-
terça-feira, 10 de abril de 2012 18:43Moderador
Leticia,
Voce esta no tipico caso da utilização do MERGE juntamente com Linked Server, me diga uma coisa, se os dados de produção e homologação forem diferentes, qual voce deve atualizar?
Fabrizzio A. Caputo
MCT
Certificações:
Oracle OCA 11g
MCITP SQL Server 2008 Implementation and Maintenance
MCITP SQL Server 2008 Developer
Blog Pessoal: www.fabrizziocaputo.wordpress.com
Blog Empresa: www.tripletech.com.br/blog
Twitter: @FabrizzioCaputo
Email: fabrizzio.antoniaci@gmail.com -
terça-feira, 10 de abril de 2012 19:40Caso o código A não esteja presente em um dos bancos (produção e homologação) não acontecerá nada neste registro. Só acontecerá a atualização quando o mesmo código for encontrado em ambos os bancos. Ai o campo status da base homologação será levado para a base produção. Isso mesmo de homologação para produção.
-
terça-feira, 10 de abril de 2012 19:53Moderador
Leticia,
Eis o que voce deve fazer então:
Passo 01: Construção do linked server, para este, conect-se na instancia de produção via SQL Server Management Studio -> Objetos do servidor -> Servidores vinculados -> Botão direito, novo servidor vinculado, escolha a opção SQL Server nos radio buttons e coloque o nome de sua instancia de homologação.
Passo 02: O Merge
Segue um exemplo para se atualizar os dados de produção
UPDATE a
SET a.Status = b.Status
FROM TabelaDeProducao a
INNER JOIN LinkedServer.Base.Schema.TabelaDeHomologacao b
ON (a.Codigo = b.Codigo)
WHERE a.Codigo NOT LIKE b.Codigo
OBS: Como é apenas um update e não update + insert por exemplo, não ha a necessidade do merge
Fabrizzio A. Caputo
MCT
Certificações:
Oracle OCA 11g
MCITP SQL Server 2008 Implementation and Maintenance
MCITP SQL Server 2008 Developer
Blog Pessoal: www.fabrizziocaputo.wordpress.com
Blog Empresa: www.tripletech.com.br/blog
Twitter: @FabrizzioCaputo
Email: fabrizzio.antoniaci@gmail.com- Sugerido como Resposta Junior Galvão - MVPMVP quinta-feira, 26 de abril de 2012 13:18
-
quarta-feira, 11 de abril de 2012 00:18Fabrizzio, apenas uma dúvida restou.. Entendi o conceito, porém tenho uma pergunta. Esse linked server não seria para quando a base está em outro servidor SQL? Digo isso por conta do nome (Linked Server) No meu caso as duas bases estão no mesmo servidor.
-
quarta-feira, 11 de abril de 2012 11:58Moderador
Leticia, Bom dia!
Desculpe, entendi que a base de homologação estava em outro servidor, como não esta, realmente não é necessario a criação do linked server, e nem a utilização do linked server na query conforme disse acima.
Fabrizzio A. Caputo
MCT
Certificações:
Oracle OCA 11g
MCITP SQL Server 2008 Implementation and Maintenance
MCITP SQL Server 2008 Developer
Blog Pessoal: www.fabrizziocaputo.wordpress.com
Blog Empresa: www.tripletech.com.br/blog
Twitter: @FabrizzioCaputo
Email: fabrizzio.antoniaci@gmail.com -
quarta-feira, 11 de abril de 2012 17:24
Frabrizzio, mas uma observação..
Esse not like
WHERE a.Codigo NOT LIKE b.Codigo
Nunca deixará o update acontecer certo? Não seria WHERE a.Codigo = b.Codigo pois pelo que entendi do script esse where seria a validação de que o campo código de um banco deve ser igual ao código do outro banco para que aconteça o uptade.
-
quinta-feira, 12 de abril de 2012 14:21
Letícia,
Isso mesmo, neste caso então poderíamos pensar em utilizar o Not Exists ao invês do Not Like.
Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]
-
quinta-feira, 12 de abril de 2012 14:28Moderador
Leticia,
O update esta quase correto, o a.Codigo NOT LIKE b.Codigo na verdade é a.STatus NOT LIKE a.Status, erro de digitação e falta de atenção, desculpe =).
Fabrizzio A. Caputo
MCT
Certificações:
Oracle OCA 11g
MCITP SQL Server 2008 Implementation and Maintenance
MCITP SQL Server 2008 Developer
Blog Pessoal: www.fabrizziocaputo.wordpress.com
Blog Empresa: www.tripletech.com.br/blog
Twitter: @FabrizzioCaputo
Email: fabrizzio.antoniaci@gmail.com

