CORRECÇÃO: Uma chamada para uma instrução RAISERROR em um lote de Transact-SQL pode causar um trabalho SQLAgent para falhar e a perda de saída no SQL Server

Traduções deste artigo Traduções deste artigo
ID do artigo: 309802 - Exibir os produtos aos quais esse artigo se aplica.
importante Este artigo contém informações sobre como modificar o registro. Certifique-se de fazer backup do registro antes de modificá-lo. Certifique-se que você sabe como restaurar o registro se ocorrer um problema. Para obter mais informações sobre como fazer backup, restaurar e modificar o registro, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
256986Descrição do registro do Microsoft Windows
Expandir tudo | Recolher tudo

Neste artigo

Sintomas

Quando um tipo de etapa do trabalho SQLAgent está script Transact-SQL e quando as instruções no campo Command do novo etapa de trabalho-< Nome de Instância do SQL Server > chamada de caixa de diálogo uma instrução Transact-SQL RAISERROR com uma gravidade nível de 11 ou maior sem a opção WITH LOG, o trabalho terminará com um resultado de falha. No entanto, embora todas as instruções Transact-SQL executadas após a instrução RAISERROR chamar é executado, todas as saída é suprimida. Portanto, nenhuma saída é gerada para as instruções após o RAISERROR instrução é executada. Isso realmente pode causar confusão sobre o que aconteceu com as instruções em um trabalho. Você deve observar um rastreamento SQL Profiler, se você desejar ver o que realmente executou. Para obter mais informações sobre um rastreamento SQL Profiler, consulte o tópico "SQL Profiler" nos manuais online do SQL Server.

Resolução

Aviso Podem ocorrer sérios problemas se você modificar o registro incorretamente usando o Editor do registro ou usando outro método. Esses problemas podem exigir que você reinstale seu sistema operacional. A Microsoft não garante que esses problemas possam ser solucionados. Modificar o registro por sua própria conta e risco.

Informações sobre o service pack

Para resolver esse problema, obtenha o service pack mais recente para o Microsoft SQL Server 2000. Para obter mais informações, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
290211Como obter o SQL Server 2000 service pack mais recente

Informações sobre o hotfix

A versão em inglês deste hotfix tem atributos de arquivo (ou atributos de arquivo posteriores) listados na tabela a seguir. As datas e horas desses arquivos estão listadas no horário de universal coordenado (UTC). Quando você exibe as informações do arquivo, ele é convertido para a hora local. Para encontrar a diferença entre o UTC e a hora local, use a guia fuso horário na ferramenta Data e hora no painel de controle.
   Date         Time   Version         Size       File name
   -------------------------------------------------------------------
   31-May-2003  05:15  2000.80.818.0      78,400  Console.exe
   27-Oct-2003  14:51  2000.80.873.0     315,968  Custtask.dll
   30-Jan-2004  02:59  2000.80.911.0      33,340  Dbmslpcn.dll
   24-Apr-2003  12:42                    786,432  Distmdl.ldf
   24-Apr-2003  12:42                  2,359,296  Distmdl.mdf
   29-Jan-2003  12:25                        180  Drop_repl_hotfix.sql
   11-Sep-2003  13:56  2000.80.859.0   1,905,216  Dtspkg.dll
   26-Aug-2003  06:46  2000.80.854.0     528,960  Dtspump.dll
   23-Jun-2003  09:10  2000.80.837.0   1,557,052  Dtsui.dll
   23-Jun-2003  09:10  2000.80.837.0     639,552  Dtswiz.dll
   23-Apr-2003  13:21                    747,927  Instdist.sql
   02-May-2003  12:26                      1,581  Inst_repl_hotfix.sql
   30-Jan-2004  02:59  2000.80.911.0      90,692  Msgprox.dll
   31-Mar-2003  12:37                      1,873  Odsole.sql
   30-Jan-2004  02:59  2000.80.911.0      62,024  Odsole70.dll
   30-Jan-2004  02:59  2000.80.911.0      25,144  Opends60.dll
   30-Jan-2004  02:59  2000.80.911.0      57,904  Osql.exe
   02-Apr-2003  09:45  2000.80.797.0     279,104  Pfutil80.dll
   04-Aug-2003  04:47                    550,780  Procsyst.sql
   11-Sep-2003  11:07                     12,305  Qfe469315.sql
   22-May-2003  09:27                     19,195  Qfe469571.sql
   29-Jan-2004  11:47                  1,090,380  Replmerg.sql
   30-Jan-2004  02:59  2000.80.911.0     221,768  Replprov.dll
   30-Jan-2004  02:59  2000.80.911.0     307,784  Replrec.dll
   29-Jan-2004  09:54  2000.80.911.0     159,813  Replres.rll
   05-Sep-2003  10:30                  1,087,150  Replsys.sql
   13-Aug-2003  02:58                    986,603  Repltran.sql
   30-Jan-2004  02:59  2000.80.911.0     287,304  Rinitcom.dll
   30-Jan-2004  02:59  2000.80.911.0      57,916  Semnt.dll
   29-Jul-2003  06:43  2000.80.819.0     492,096  Semobj.dll
   31-May-2003  04:57  2000.80.818.0     172,032  Semobj.rll
   02-Jan-2004  06:12  2000.80.904.0      53,832  Snapshot.exe
   09-Dec-2003  06:37                    117,834  Sp3_serv_uni.sql
   04-Feb-2004  11:16  2000.80.913.0      28,672  Sqlagent.dll
   04-Feb-2004  11:17  2000.80.913.0     311,872  Sqlagent.exe
   07-Jan-2004  09:08  2000.80.905.0     126,976  Sqlakw32.dll
   30-Jan-2004  02:59  2000.80.911.0   4,215,360  Sqldmo.dll
   07-Apr-2003  04:14                     25,172  Sqldumper.exe
   29-Jan-2004  09:47  2000.80.911.0      28,672  Sqlevn70.rll
   30-Jan-2004  02:59  2000.80.911.0     180,792  Sqlmap70.dll
   02-Sep-2003  13:26  2000.80.857.0     188,992  Sqlmmc.dll
   02-Sep-2003  09:33  2000.80.857.0     479,232  Sqlmmc.rll
   21-Oct-2003  10:38  2000.80.871.0     401,984  Sqlqry.dll
   30-Jan-2004  02:59  2000.80.911.0      57,920  Sqlrepss.dll
   04-Feb-2004  11:18  2000.80.913.0   7,610,449  Sqlservr.exe
   30-Jan-2004  02:59  2000.80.911.0     590,396  Sqlsort.dll
   30-Jan-2004  02:59  2000.80.911.0      45,644  Sqlvdi.dll
   30-Jan-2004  02:59  2000.80.911.0     106,588  Sqsrvres.dll
   30-Jan-2004  02:59  2000.80.911.0      33,340  Ssmslpcn.dll
   30-Jan-2004  02:59  2000.80.911.0      82,492  Ssnetlib.dll
   30-Jan-2004  02:59  2000.80.911.0      25,148  Ssnmpn70.dll
   27-Oct-2003  14:51  2000.80.873.0     123,456  Stardds.dll
   30-Jan-2004  02:59  2000.80.911.0     158,240  Svrnetcn.dll
   30-Jan-2004  02:59  2000.80.911.0      76,416  Svrnetcn.exe
   30-Apr-2003  10:22  2000.80.816.0      45,132  Ums.dll     
   30-Jan-2004  02:59  2000.80.911.0      98,872  Xpweb70.dll
Observação Devido às dependências do arquivo, o hotfix mais recente ou o recurso que contém esses arquivos também pode conter arquivos adicionais.

Depois de aplicar esse hotfix, comportamento de SQL Server Agent é definido por um registro novo valor DWORD chamado TruncateJobResultOnError em uma das seguintes subchaves do Registro:
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQLServer\SQLServerAgent (default instance)
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\<InstanceName>\SQLServerAgent (named instance)
Para ativar o novo comportamento, defina esse valor TruncateJobResultOnError como 0. Após reiniciar o SQL Server Agent, resultados de trabalho não serão truncados por instruções raiserror . Para restaurar o comportamento herdado, você pode definir o valor TruncateJobResultOnError para 1. Isso é o valor padrão se o valor não está definido.

Aviso A alteração do valor como 0 pode não ser uma abordagem eficiente quando há um script que tenha um loop infinito com erro que está sendo lançado. Agente registra o erro continuamente e pode usar todo o espaço no disco.

Como Contornar

Para solucionar o problema, use qualquer um dos seguintes métodos, de acordo com suas necessidades.

Método 1

Determinar que nível de gravidade que deseja usar
  • Se você deseja chamar uma instrução RAISERROR para fins informativos, você deve usar um nível de gravidade de 10 para a mensagem de erro. Um nível de gravidade de 10 representa uma mensagem informativa que indica que ocorreu um problema porque o usuário inseriu informações incorretas.
  • Se você deseja anular o lote quando uma instrução RAISERROR é chamada, você deve usar um nível de gravidade de 20 ou superior para a mensagem de erro e você deve incluir a opção WITH LOG com a instrução RAISERROR. Quando você fizer isso, todas as instruções Transact-SQL que deveriam executar após a chamada para a instrução RAISERROR são anuladas e todas as transações abertas são automaticamente revertidas.

    Para obter mais informações sobre os níveis de gravidade, consulte o tópico "Níveis de gravidade de mensagem de erro" nos manuais online do SQL Server.

Método 2

Usar um arquivo de script na etapa de trabalho
Se desejar que o script inteiro para executar, independentemente da freqüência a instrução RAISERROR é chamada, e o nível de gravidade é menor que 20, você pode usar um arquivo de script na etapa de trabalho. Para fazer isso, execute estas etapas:
  1. Salve o script em um arquivo.
  2. Criar um trabalho do SQL Server Agent com uma etapa do trabalho CmdExec e execute o arquivo de script na etapa.

    Aqui está um exemplo:
    osql -E -i c:\script.sql
Quando você usa um arquivo de script, você receberá o mesmo resultado se o lote é executado usando o utilitário osql que você receber se o lote é executado usando o SQL Query Analyzer.

Chamar uma instrução RAISERROR com um nível de gravidade de 20 ou superior com a opção WITH LOG faz com que a conexão para fechar e todas as instruções que deveriam executar após a chamada RAISERROR são ignorados.

Situação

A Microsoft confirmou que este é um problema nos produtos da Microsoft listados na seção "Aplica-se a". Esse problema foi corrigido primeiro no Microsoft SQL Server 2000 Service Pack 4.

Mais Informações

Se o nível de gravidade da mensagem de erro na etapa de trabalho do SQL Server Agent da instrução RAISERROR é 2 a 9, o trabalho e o trabalho de etapa final com um resultado de falha. No entanto, a saída não é suprimida para as instruções que são executadas após a instrução RAISERROR no lote.

Se o nível de gravidade do erro mensagem no RAISERROR instrução é 10, 1 ou 0, o trabalho e a etapa de trabalho é executado com êxito. Portanto, o problema mencionado na seção "Sintomas" deste artigo não ocorre.

Embora o trabalho do SQL Server Agent falhar se você executar o mesmo script SQL utilizando o SQL Query Analyzer, o utilitário isql ou o utilitário osql , você receberá o resultado que você espera.

Etapas para reproduzir o comportamento

  1. Crie um novo trabalho do SQL Server Agent com uma etapa de trabalho de Scripts do TRANSACTA-SQL (TSQL) .
  2. Type or Paste the following Transact-SQL statement in the Command Box.
       select convert(varchar(50), @@version) as ' SQL Server Version Number'
       raiserror('Test raiserror with severity 10', 10, 1)
       select id, convert(varchar(12), name) as 'Table Name' 
        from sysobjects where id < 4
  3. Na guia Avançado , na seção Opções de comando de scripts do TRANSACTA-SQL (TSQL) , digite C:\Raiserror.log na caixa arquivo de saída .
  4. Clique para selecionar a opção de Acrescentar .
  5. Clique em Aplicar e, em seguida, clique em OK .
  6. Clique em Aplicar e, em seguida, clique em OK .
  7. No SQL Server Enterprise Manager, clique com o botão direito do trabalho de SQL Server Agent foi criado e, em seguida, clique em Iniciar trabalho .
  8. Inicie rastreamento do SQL Profiler.
  9. For the same SQL Server Agent Job Step, Change the severity level to 11 by replacing the Command in the Job Step as follows.
       select convert(varchar(50), @@version) as ' SQL Server Version Number'
       raiserror('Test raiserror with severity 11', 11, 1)
       select id, convert(varchar(12), name) as 'Table Name' 
        from sysobjects where id < 4
  10. Execute o trabalho novamente.
Aqui está o resultado é gerado no arquivo raiserror.log.
Job 'raiserror' : Step 1, 'test raiserror' : Began Executing 2002-07-23 15:48:59

SQL Server Version Number                         
--------------------------------------------------
Microsoft SQL Server  2000 - 8.00.534 (Intel x86) 

(1 rows(s) affected)

Test raiserror with severity 10 [SQLSTATE 01000]
id          Table Name  
----------- ------------
1           sysobjects
2           sysindexes
3           syscolumns

(3 rows(s) affected)

Job 'raiserror' : Step 1, 'test raiserror' : Began Executing 2002-07-23 15:49:17

SQL Server Version Number                         
--------------------------------------------------
Microsoft SQL Server  2000 - 8.00.534 (Intel x86) 

(1 rows(s) affected)

Msg 50000, Sev 11: Test raiserror with severity 11 [SQLSTATE 42000]

Nesse arquivo raiserror.log, você pode ver que, com um nível de gravidade de 10, todas as saída do trabalho foi impressa no arquivo de saída, e o trabalho obtiveram um resultado bem-sucedido.

Nesse arquivo raiserror.log, você pode ver que, com um nível de gravidade de 11, apenas a saída das duas primeiras instruções foi impresso no arquivo de saída, e o trabalho obtiveram um resultado com falha. Além disso, a mensagem RAISERROR é um formato de mensagem erro em vez de em um formato de um nível de gravidade 10 informativo. O arquivo de rastreamento mostra que todas as instruções foi executado com êxito.

Se você alterar o nível de gravidade para um número de 2 a 9, a saída não é suprimida e o resultado do trabalho falhará para a etapa e para o trabalho. O formato de mensagem será o mesmo como formato de mensagem de erro para o nível de gravidade 11 ou superior.

Propriedades

ID do artigo: 309802 - Última revisão: sexta-feira, 2 de novembro de 2007 - Revisão: 5.5
A informação contida neste artigo aplica-se a:
  • Microsoft SQL Server 2000 Developer Edition
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 2000 Enterprise Edition
  • Microsoft SQL Server 2000 Personal Edition
  • Microsoft SQL Server 2000 Workgroup Edition
  • Microsoft SQL Server 2000 Desktop Engine (Windows)
  • Microsoft SQL Server 2000 Enterprise Edition 64-bit
Palavras-chave: 
kbmt kbhotfixserver kbqfe kbqfe kbsqlserv2000presp4fix kbfix kbbug kbpending KB309802 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 309802

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com