none
FETCH para atualizar registros quando existiram mudanças RRS feed

  • Pergunta

  •    Fala pessoa, td certo?

       Eu tenho 2 tabelas distintas. A primeira contém dados que eu processo para atualizar a segunda.

       Acontece que somente os dados que sofreram alteração na primeira tabela precisam ser atualizados na segunda. No cursor que eu fiz eu abro o Cursor e o FETCH passa por todos os registros da segunda: Ele carrega nas variáveis todos os dados da primeira tabela (até aí tudo bem) e passa por todos os registros da segunda tabela, atualizando tudo novamente e é justamente isso que não pode acontecer porque nem todos os registros da segunda tabela em relação à primeira sofreram alteração.

      Eu sei que pra resolver isso (fazer com que não reescreva os registros da segunda tabela ) eu preciso criar um outro cursor dentro do cursor para a segunda tabela, fazendo com o que ele carregue na memória somente os registros da segunda tabela para serem atualizados.

      Alguém sabe como posso resolver?

    Obrigado

       

       

    sábado, 4 de maio de 2013 10:04

Respostas

Todas as Respostas

  • Olá Riccow...

    Para realizar a comparação entre as colunas das 2 tabelas.... você está utilizando como como referencia uma coluna PK (Id, Código, CPF etc) ?

    À disposição...


    Não esqueça de marcar o post como útil caso tenha te ajudado.

    sábado, 4 de maio de 2013 13:41
  •   Olá Roberson!

      Isso mesmo; 

      Por exemplo (as 2 tabelas):

      Table_Producao (
      Id_Funcionario int,
      Nome_Funcionario varchar(30),
      CPF_Funcionario varchar(11));

      Table_DadosNovos (... mesma estrutura...) 

      Os campos à serem atualizados obviamente existem nas 2 tabelas. Já estou considerando constraints, etc... Eu precisarei levar pra memória através do Cursor todos os registros da Table_Producao e Table_DadosNovos, contudo eu tenho que dar um jeito de gravar na Tabela_Produção somente os dados que estiverem divergentes com a Tabela_DadosNovos, sendo comparados pelo campo 'Id_Funcionario'.

      Da maneira que eu construí o cursor hoje, independente de ter alteração ou não, todos os dados na tabela Produção estão sendo gravados novamente ao rodar o Cursor.

      Se puder ajudar ficarei muito grato!

       

    sábado, 4 de maio de 2013 19:02
  • Deleted
    sábado, 4 de maio de 2013 23:08
  • Deleted
    domingo, 5 de maio de 2013 02:27
  •   Oi José!

      Isso mesmo, atualizo as linhas em Table_Producao a partir de Table_DadosNovos e incluo dados quando houver Id_Funcionario diferente. Isso que postei é para integração de Sistemas utilizando Scripts direto no banco de dados do meu sistema. O cliente tem o sistema dele e de tempos em tempo (2, 3 vezes ao dia) executo a rotina para que o banco de dados dele atualize o meu banco via Linked Server, arquivo .txt, csv ou outra forma; ou ainda através de uma procedure que é executada quando há alteração no banco de dados dele.

      Obrigadão pela Força!

      Quanto à performance, você recomenda o MERGE em detrimento ao CURSOR? Pelo que entendi o MERGE só vai escrever no banco onde houver alteração ou quando for inclusão, embora ele suba para memória todos os dados para haver a comparação. Pelos meus estudos, vi que subir para a memória é muito mais performático do que ficar escrevendo no banco todos os registros novamente, como eu estava fazendo antes da sua dica.

    domingo, 5 de maio de 2013 03:57
  •   Oi José!

       Acabei vendo aqui: ainda com o MERGE, eu tenho todos os registros atualizados na tabela de produção mesmo que eles não tenham sofrido alteração. Eu executei o MERGE se realizar nenhuma alteração na tb_DadosNovos e ele atualizou a produção.

       Isso pra mim também ainda acabaria dando um problema de performance, no caso de eu ter 100 mil registros, por exemplo; 1 a 1 cada registro seria novamente gravado, mesmo sem ter sofrido alteração.

       Nisso eu acho que caio novamente no CURSOR pois terei que subir pra memória (pro CURSOR) todos os dados da tabela Tb_DadosNovos e com eles já ne memória atualizar somente os dados da Tb_Producao que tiverem o ID_Funcionario correspondente rs.

       Valeu novamente pela ajuda e por novas orientações

    domingo, 5 de maio de 2013 04:25
  • Deleted
    domingo, 5 de maio de 2013 10:28
  • Deleted
    domingo, 5 de maio de 2013 10:45
  • Deleted
    domingo, 5 de maio de 2013 10:53
  • Deleted
    • Marcado como Resposta Giovani Cr quarta-feira, 9 de outubro de 2013 18:12
    segunda-feira, 6 de maio de 2013 10:07