none
Bulk insert numa table com PK RRS feed

  • Pergunta

  •  

    Bom dia pessoal, meu problema é o seguinte:

     

    tenho uma tabela com aprox 9milhões de registros, e possui um campo (chamado proposta) que é chave primaria. Diariamente preciso alimentar esta tabela, fiz um processo via bulk insert, mas o problema é q a proposta se repete por alguns dias no arquivo de carga, e neste caso devo apenas ignorar as que ja existem na base, incluindo apenas as propostas novas.... alguem sabe como faço isso??

     

    obrigado

    sábado, 5 de julho de 2008 14:33

Respostas

  • Olá Wilmar,

     

    Você deve ter sua tabela de 9 milhões de registros e na importação dos 65mil registros, há alguns registros novos (a chave não é duplicada) e alguns registros de atualização (a chave é duplicada). Vou chamar essa tabela de tblPrincipal e cuja chave primária vou chamar de "codigo". Proponha que você crie uma segunda tabela que vou chamar de tblIntermediaria cuja a chave primaria tambem se chama codigo.

     

    O que eu proponho é o seguinte:

     

    - Importe os registros via BULK INSERT para a tabela intermediária

    - Atualize os registros da tabela principal com base nos registros da tabela intermediária que tenham chaves equivalentes

     

    Code Snippet

    UPDATE tblPrincipal SET

    Campo1 = tblIntermediaria.Campo1,

    Campo1 = tblIntermediaria.Campo2

    FROM tblPrincipal AS TPrin

    INNER JOIN tblIntermediaria AS TInt ON TPrin.Codigo = TInt.Codigo

     

    - Insira os novos registros da tabela intermediária na tabela principal com base na chave primária. Ex:

     

    Code Snippet

    INSERT INTO tblPrincipal (Campos)

    SELECT Campos FROM tblIntermediaria AS TInt

    WHERE NOT EXISTS

    (SELECT * FROM tblPrincipal AS TPrin WHERE TInt.Codigo = TPrin.Codigo)

     

    - Exclua os registros da tabela intermediária para que ela esteja "limpa" para a próxima carga

     

    Dessa forma lhe atenderia ?

     

    [ ]s,

     

    Gustavo

    sábado, 5 de julho de 2008 16:21
    Moderador

Todas as Respostas

  • Bom Dia,

     

    Tenho algumas idéias, mas também algumas dúvidas.

     

    - Quantas linhas existem no arquivo utilizado para que você alimete a tabela ?

    - Qual o tamanho médio do arquivo ?

     

    [ ]s,

     

    Gustavo

     

    sábado, 5 de julho de 2008 14:58
    Moderador
  •  

    Em média são 65000(txt de uns 20mb) linhas diárias, dessas eu incluo apenas 11000 linhas, o restante eu devo ignorar, pois são as duplicidades...

    sábado, 5 de julho de 2008 15:09
  • Olá Wilmar,

     

    Nesse caso, eu sugiro que você importe os 65000 registros para uma outra tabela (uma tabela intermediária) e posteriormente rode as instruções de INSERT para os novos registros e UPDATE para os registros potencialmente duplicados.

     

    Após terminar o trabalho exclua os registros da tabela intermediária.

     

    [ ]s,

     

    Gustavo

    sábado, 5 de julho de 2008 15:29
    Moderador
  • Blz, atualmente ja mantemos uma base com as informações do dia, porem, quando eu tento dar um insert desta para a tabela completa, não funciona por causa das duplicidades

    sábado, 5 de julho de 2008 15:55
  • Olá Wilmar,

     

    Você deve ter sua tabela de 9 milhões de registros e na importação dos 65mil registros, há alguns registros novos (a chave não é duplicada) e alguns registros de atualização (a chave é duplicada). Vou chamar essa tabela de tblPrincipal e cuja chave primária vou chamar de "codigo". Proponha que você crie uma segunda tabela que vou chamar de tblIntermediaria cuja a chave primaria tambem se chama codigo.

     

    O que eu proponho é o seguinte:

     

    - Importe os registros via BULK INSERT para a tabela intermediária

    - Atualize os registros da tabela principal com base nos registros da tabela intermediária que tenham chaves equivalentes

     

    Code Snippet

    UPDATE tblPrincipal SET

    Campo1 = tblIntermediaria.Campo1,

    Campo1 = tblIntermediaria.Campo2

    FROM tblPrincipal AS TPrin

    INNER JOIN tblIntermediaria AS TInt ON TPrin.Codigo = TInt.Codigo

     

    - Insira os novos registros da tabela intermediária na tabela principal com base na chave primária. Ex:

     

    Code Snippet

    INSERT INTO tblPrincipal (Campos)

    SELECT Campos FROM tblIntermediaria AS TInt

    WHERE NOT EXISTS

    (SELECT * FROM tblPrincipal AS TPrin WHERE TInt.Codigo = TPrin.Codigo)

     

    - Exclua os registros da tabela intermediária para que ela esteja "limpa" para a próxima carga

     

    Dessa forma lhe atenderia ?

     

    [ ]s,

     

    Gustavo

    sábado, 5 de julho de 2008 16:21
    Moderador
  • Valewwww Gustavo, era essa parte do not exists que eu num sabia como fazer, é isso q preciso mesmo, muito obrigado! e bom fds

    sábado, 5 de julho de 2008 17:03