none
Atualizar campo usando bancos de dados diferentes. RRS feed

  • Pergunta

  • 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 Aguiar terça-feira, 10 de abril de 2012 19:41 (De:SQL Server - Infra Geral)
    terça-feira, 10 de abril de 2012 18:39

Todas as Respostas

  • 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 18:43
    Moderador
  • Caso 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:40
  • 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

    terça-feira, 10 de abril de 2012 19:53
    Moderador
  • Fabrizzio, 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 00:18
  • 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 11:58
    Moderador
  • 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.

    quarta-feira, 11 de abril de 2012 17:24
  • 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:21
  • 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

    quinta-feira, 12 de abril de 2012 14:28
    Moderador