locked
Execução de Job - falha RRS feed

  • Pergunta

  • Pessoal,

     

    Tenho um job que executa uma procedure. Esta procedure lê um arquivo texto, faz alguns tratamentos e realiza inclusões ou alterações destas informações no banco de dados. Quando ocorre alguma falha em um update ou insert da procedure o JOB está sendo encerrado, mas eu não quero que isto ocorra. Quando acontecer algum erro eu quero que a procedure ignore o problema e continue a execução, pois os demais registros deverão ser tratados. Já tentei o comando @@ERROR, mas quando ocorre o erro, o JOB já aborta. Nem chega a passar no comando que testa o erro. 

    quarta-feira, 26 de novembro de 2008 17:03

Respostas

  • Boa Tarde JzGomes,

     

    Seja bem vindo ao fórum de SQL Server do Technet.

     

    Nós participantes do fórum tentaremos ajudá-lo com suas dúvidas e problemas através de nosso conhecimento, disponibilidade e experiência.

     

    Não sei como você está fazendo essa importação, mas se for via BCP ou BULK INSERT, é possível configurar um limite de erros em um comando. Dessa forma, você pode atribuir um limite (digamos 10) e caso ocorra menos de dez erros, os registros continuarão a ser importados.

     

    Essa abordagem deve ser utilizada quando a ocorrência de erros for pequena e fácil de tratar depois. Do contrário, recomendo preparar sua procedure para corrigir "On Demand" registros considerados errados.

     

    [ ]s,

     

    Gustavo

    quarta-feira, 26 de novembro de 2008 18:47

Todas as Respostas

  • Olá Gomes,

     

    Olha, posso estar enganado e algum colega ter descoberto alguma solução (o que seria ótimo, pois tive este problema há pouco tempo), mas até onde sei, o SQL Server atua desta forma para erros cuja severidade seja maior que 10. Confirme, é este o seu caso? Qual erro está "passando batido"?

     

    A lógica do SQL é algo como "para que continuar a execução, se a procedure está com erro? corrija, e depois execute-a novamente".

     

    A "solução" seria dividir teu job em mais steps (para que cada um possa ser "pulado" e logado, no caso de falhas) ou realizar a execução via linha de comando (SQLCMD).

     

    Um abraço,

    Raul Santos Neto

     

    quarta-feira, 26 de novembro de 2008 17:27
  • Boa Tarde JzGomes,

     

    Seja bem vindo ao fórum de SQL Server do Technet.

     

    Nós participantes do fórum tentaremos ajudá-lo com suas dúvidas e problemas através de nosso conhecimento, disponibilidade e experiência.

     

    Não sei como você está fazendo essa importação, mas se for via BCP ou BULK INSERT, é possível configurar um limite de erros em um comando. Dessa forma, você pode atribuir um limite (digamos 10) e caso ocorra menos de dez erros, os registros continuarão a ser importados.

     

    Essa abordagem deve ser utilizada quando a ocorrência de erros for pequena e fácil de tratar depois. Do contrário, recomendo preparar sua procedure para corrigir "On Demand" registros considerados errados.

     

    [ ]s,

     

    Gustavo

    quarta-feira, 26 de novembro de 2008 18:47
  • Gustavo e Raul,

     

    Obrigada pela ajuda. Acho que vou mudar de estratégia e implementar esta rotina no Cold Fusion. Assim, conseguirei tratar todos os erros de maneira mais simples antes de enviar o comando para o banco de dados. A única coisa que eu precisava era que o job não abotasse, mas já que aborta, vou buscar outra solução.

     

    Gustavo, eu uso o BULK INSERT para fazer a importação do arquivo texto para uma tabela, depois eu vou lendo registro por registro desta tabela e montando, dinamicamente, comandos SQL. Como não consigo garantir que as informações deste arquivo texto estejam 100%, o mais comum é que tenha um registro com uma informação que possa gerar erro quando eu montar a minha consulta SQL dinamicamente. O arquivo é enorme, mais de 613 mil linhas. No Cold Fusion eu usarei um TRY e poderei apenas tratar se ocorreu erro ou não, sem me preocupar que o job será abortado.

     

    De qualquer forma, agradeço a ajuda, foi muito útil. 

    Abraços,

    Jaíza Gomes

     

    quinta-feira, 27 de novembro de 2008 10:18
  • Jaiza,

     

    Realmente é um processo pessado!!!

    quinta-feira, 27 de novembro de 2008 10:55
    Moderador
  • Gustavo,

     

    Outra coisa que observei é que o comando BULK INSERT não está funcionando 100% correto. Ele não faz a cópia seguindo fielmente a ordem das linhas do arquivo texto e, no meu caso, isto tem que acontecer, pois, caso contrário gerará erros na hora de montar o SQL dinâmico. E observei também que o problema sempre ocorre por volta do registro de número 1620. Eu olho no arquivo texto e vejo que a informação que está nesta linha não coincide com o que está na tabela para qual o BULK INSERT fez a importação.

     

    Por exemplo: No arquivo original eu tenho as seguintes informações

     

    DisplayName: Windows 2000 Hotfix - KB917537

    ProdID: KB917537

    Publisher: Microsoft Corporation

    Version: 20060411.110122

    InstallDate: 20060808

     

     

    Já quando eu importo para a tabela ele fica da seguinte forma:

     

    DisplayName: Windows 2000 Hotfix - KB935839
    DisplayName: Atualiza‡Æo de Seguran‡a para Windows XP (KB896358)
    ProdID: KB896358
    Publisher: Microsoft Corporation
    Version: 1
    InstallDate: 20050624

     

    Desta forma, quando eu for montar o SQL vai dar erro porque fará referência a 2 colunas DisplayName, sendo que na tabela existe apenas 1 coluna DisplayName.

     

    Estou achando que este comando BULK INSERT não é muito confiável. Ou será que eu é que esqueci de passar algum parâmetro importante?

     

    Abraços,

    Jaíza

    quinta-feira, 27 de novembro de 2008 13:44