Usuário com melhor resposta
Execução de Job - falha

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:55Moderador -
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: 20050624Desta 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