CORRECÇÃO: Uma chamada para uma instrução RAISERROR numa secção de Transact-SQL pode causar uma tarefa SQLAgent falha e a perda de saída no SQL Server

Traduções de Artigos Traduções de Artigos
Artigo: 309802 - Ver produtos para os quais este artigo se aplica.
importante Este artigo contém informações sobre como modificar o registo. Certifique-se de que cópia de segurança do registo antes de o modificar. Certifique-se que sabe como restaurar o registo se ocorrer um problema. Para obter mais informações sobre como efectuar uma cópia de segurança, restaurar e modificar o registo, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
256986Descrição do registo do Microsoft Windows
Expandir tudo | Reduzir tudo

Nesta página

Sintomas

Quando um tipo de passo de tarefa SQLAgent é script Transact-SQL e quando as instruções do campo de comando de novo passo de projecto-< Nome de Instância Do SQL server > chamada de caixa de diálogo uma instrução Transact-SQL RAISERROR com uma classificação de gravidade superior sem a opção WITH LOG ou nível de 11, a tarefa irá terminar com um resultado de falhado. No entanto, apesar de todas as instruções de Transact-SQL executado após a instrução RAISERROR chamarem é executado, o resultado é suprimido. Por conseguinte, não saída é gerada para as instruções após a RAISERROR instrução executa. Na realidade poderá causar confusão sobre o que aconteceu às declarações numa tarefa. Deve observar um rastreamento SQL Profiler se pretender ver o que realmente executado. Para obter mais informações sobre um rastreamento SQL Profiler, consulte o tópico "SQL Profiler" no SQL Server Books Online.

Resolução

aviso Podem ocorrer problemas graves se modificar o registo incorrectamente utilizando o Editor de registo ou utilizando outro método. Estes problemas poderão forçar a reinstalação do sistema operativo. Microsoft não garante que estes problemas podem ser resolvidos. Modificar o registo por sua conta e risco.

Informações sobre Service Packs

Para resolver este problema, obtenha o service pack mais recente do Microsoft SQL Server 2000. Para obter mais informações, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
290211Como obter o SQL Server 2000 service pack mais recente

Informações sobre a correcção

A versão inglesa desta correcção tem os atributos de ficheiro (ou atributos de ficheiro posteriores) listados na seguinte tabela. As datas e horas destes ficheiros são indicadas na hora universal coordenada (UTC). Quando visualiza as informações do ficheiro, é convertido para a hora local. Para determinar a diferença entre a UTC e a hora local, utilize o separador fuso horário na ferramenta Data e hora no painel de controlo.
   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
Nota Devido a dependências de ficheiros, a correcção mais recente ou funcionalidade que contém estes ficheiros pode também conter ficheiros adicionais.

Depois de aplicar esta correcção, SQL Server Agent comportamento é definido por um registo novo valor DWORD que é designado por TruncateJobResultOnError das seguintes subchaves de registo:
  • 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 activar o novo comportamento, defina este valor TruncateJobResultOnError como 0. Depois de reiniciar o agente do SQL Server, os resultados da tarefa já não serão truncados por instruções raiserror . Para restaurar o comportamento de legacy, pode definir o valor de TruncateJobResultOnError para 1. Isto é o valor predefinido se o valor não está definido.

aviso A alteração do valor para 0 não pode ser uma abordagem eficaz quando existe um script que tenha um ciclo infinito com o erro ser emitido. Agente regista o erro continuamente e poderá utilizar todo o espaço em disco.

Como contornar

Para contornar o problema, utilize qualquer um dos seguintes métodos, consoante os requisitos.

Método 1

Determinar o nível de gravidade que pretende utilizar
  • Se pretender contactar uma instrução RAISERROR para fins informativos, tem de utilizar um nível de gravidade de 10 para a mensagem de erro. Um nível de gravidade de 10 representa uma mensagem informativa indica que ocorreu um problema porque o utilizador introduziu informações incorrectas.
  • Se desejar abortar a secção quando uma instrução RAISERROR é chamada, tem de utilizar um nível de gravidade de 20 ou superior para a mensagem de erro e tem de incluir a opção WITH LOG com a instrução RAISERROR. Quando o fizer, todas as instruções de Transact-SQL que foram suposto executar depois da chamada para a instrução RAISERROR são interrompidas e todas as transacções abertas são automaticamente revertida.

    Para obter mais informações sobre os níveis de classificação de gravidade, consulte o tópico "Níveis de gravidade de mensagem de erro" no SQL Server Books Online.

Método 2

Utilizar um ficheiro de scripts no passo tarefa
Se desejar que o todo script seja executado independentemente da frequência a instrução RAISERROR denomina-se e o nível de gravidade é menor do que 20, pode utilizar um ficheiro de script no passo tarefa. Para o fazer, siga estes passos:
  1. Guarde o script num ficheiro.
  2. Criar uma tarefa do agente do SQL Server com um passo de tarefa CmdExec e execute o ficheiro de script no passo.

    Eis um exemplo:
    osql -E -i c:\script.sql
Quando utiliza um ficheiro de script, receberá o mesmo resultado se a secção for executada utilizando o utilitário osql que recebe se a secção for executada utilizando 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 ligação para fechar e todas as afirmações que foram suposto executar depois da chamada RAISERROR são ignorados.

Ponto Da Situação

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

Mais Informação

Se o nível de gravidade da mensagem de erro no SQL Server Agent tarefa passo da instrução RAISERROR 2 a 9, a tarefa e a tarefa passo final com um resultado falhou. No entanto, a saída não está suprimida para as instruções que são executadas depois da instrução RAISERROR no lote.

Se o nível de gravidade do erro mensagem in a RAISERROR instrução é 10, 1 ou 0, a tarefa e o passo de tarefa é executada com êxito. Por conseguinte, o problema mencionado na secção "Sintomas" deste artigo não ocorre.

Apesar da tarefa de agente do SQL Server falhar se executar o script SQL mesmo utilizando o SQL Query Analyzer, o utilitário isql ou o utilitário osql , receberá o resultado que pretende.

Passos para reproduzir o comportamento

  1. Crie uma nova tarefa de agente do SQL Server com um passo de tarefa de Script Transact-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. No separador Avançadas , na secção de Opções de comando de Script Transact-SQL (TSQL) , escreva C:\Raiserror.log na caixa ficheiro de saída .
  4. Clique para seleccionar a opção 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 rato a tarefa de agente do SQL Server que foi criada e clique em Iniciar Job .
  8. Inicie o SQL Profiler rastreio.
  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 a tarefa novamente.
Segue-se o resultado é gerado no ficheiro 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]

Este ficheiro raiserror.log, pode ver que com um nível de gravidade de 10, todas as saídas da tarefa foi impressa no ficheiro de exportação e a tarefa tiveram um resultado com êxito.

Este ficheiro raiserror.log, pode ver que com um nível de gravidade de 11, apenas o resultado do primeiro duas instruções foi impresso para o ficheiro de saída e a tarefa tiveram um resultado falhou. Além disso, a mensagem RAISERROR é num formato de mensagem de erro em vez de num formato de um nível de gravidade 10 informativo. O ficheiro de rastreio mostra todas as afirmações executou com êxito.

Se alterar o nível de gravidade para um número de 2 a 9, a saída não está suprimida e o resultado de tarefa falhará para o passo e para a tarefa. O formato de mensagem será o mesmo que um formato de mensagem de erro de nível de gravidade 11 ou superior.

Propriedades

Artigo: 309802 - Última revisão: 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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