REVISIÓN: Una llamada a una instrucción RAISERROR en un lote de Transact-SQL puede provocar un trabajo SQLAgent fallar a perder la salida en SQL Server

Seleccione idioma Seleccione idioma
Id. de artículo: 309802 - Ver los productos a los que se aplica este artículo
importante Este artículo contiene información acerca de cómo modificar el registro. Compruebe que ha hecho una copia de seguridad del Registro antes de modificarlo. Compruebe que sabe restaurar el Registro en caso de que se produzca algún problema. Para obtener más información acerca de cómo realizar una copia de seguridad, restaurar y modificar el registro, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
256986Definición del Registro de Microsoft Windows
Expandir todo | Contraer todo

En esta página

Síntomas

Cuando un tipo de paso de trabajo SQLAgent es secuencia de comandos Transact-SQL y las instrucciones en el campo comando de la nueva paso de trabajo < Nombre de Instancia de SQL Server > llamada del cuadro de diálogo una instrucción RAISERROR de Transact-SQL con un nivel de gravedad de 11 o superior sin la opción WITH LOG, el trabajo terminará con un resultado error. Sin embargo, aunque todas las instrucciones de Transact-SQL que se ejecutan después de la instrucción RAISERROR llamar a se ejecuta, se suprime todo el resultado. Por lo tanto, no se generan resultados para las instrucciones después de la RAISERROR instrucción se ejecuta. Realmente, esto puede provocar confusión sobre ¿qué ha ocurrido con las instrucciones de un trabajo. Debe buscar en una traza del Analizador de SQL si desea ver lo que realmente se ejecutó. Para obtener más información acerca de una traza del Analizador SQL, vea el tema "Analizador de SQL" en los libros en pantalla de SQL Server.

Solución

Advertencia Pueden producirse problemas graves si modifica incorrectamente el registro mediante el Editor del registro o utilizando otro método. Estos problemas pueden requerir que reinstale el sistema operativo. Microsoft no puede garantizar la solución de esos problemas. Modifique el Registro bajo su responsabilidad.

Información de Service Pack

Para resolver este problema, consiga el Service Pack más reciente para Microsoft SQL Server 2000. Para obtener más información, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
290211Cómo obtener el Service Pack más reciente de SQL Server 2000

Información de revisiones

La versión en inglés de este hotfix tiene los atributos de archivo (o atributos de último archivo) mostrados en la siguiente tabla. Las fechas y las horas de estos archivos se muestran en hora universal coordinada (UTC). La información de los archivos se convertirá a la hora local cuando la vea. Para averiguar la diferencia entre hora UTC y la hora local, utilice la ficha zona horaria de la herramienta fecha y hora en el panel de control.
   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 Debido a la interdependencia entre archivos, el más reciente revisión o característica que contiene estos archivos quizás contenga también archivos adicionales.

Después de aplicar este hotfix, el comportamiento de Agente SQL Server se define mediante un registro nuevo valor DWORD que se llama TruncateJobResultOnError en una de las siguientes subclaves del 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 habilitar el nuevo comportamiento, establezca este valor TruncateJobResultOnError en 0. Después de reiniciar al Agente SQL Server, los resultados de trabajo ya no se truncarán por las instrucciones raiserror . Para restaurar el comportamiento heredado, puede establecer el valor de TruncateJobResultOnError a 1. Éste es el valor predeterminado si no se establece el valor.

Advertencia El cambio de valor a 0 no sea un enfoque eficaz cuando hay una secuencia de comandos que tiene un bucle infinito con error que se va a producir. Agente registra el error continuamente y puede usar todo el espacio de disco.

Solución

Para evitar el problema, utilice uno de los métodos siguientes, según sus requisitos.

Método 1

Determinar qué nivel de gravedad que desea utilizar
  • Si desea llamar a una instrucción RAISERROR con fines informativos, debe utilizar un nivel de gravedad de 10 para el mensaje de error. Un nivel de gravedad de 10 representa un mensaje informativo que indica que ocurrió un problema porque el usuario especificó información incorrecta.
  • Si desea anular el lote cuando se llama a una instrucción RAISERROR, debe utilizar un nivel de gravedad de 20 o superior para el mensaje de error y debe incluir la opción WITH LOG con la instrucción RAISERROR. Al hacerlo, todas las instrucciones de Transact-SQL se debían ejecutar después de la llamada a la instrucción RAISERROR se anulan y todas las transacciones abiertas se deshacen automáticamente.

    Para obtener más información acerca de los niveles de gravedad, vea el tema "Niveles de gravedad del mensaje de error" en los libros en pantalla de SQL Server.

Método 2

Utilice un archivo secuencia de comandos en el paso de trabajo
Si desea que la secuencia de comandos completa para ejecutar independientemente de la frecuencia se llama a la instrucción RAISERROR y el nivel de gravedad es menor que 20, puede utilizar un archivo de secuencia de comandos en el paso de trabajo. Para ello, siga estos pasos:
  1. Guardar la secuencia de comandos en un archivo.
  2. Crear un trabajo SQL Server Agent con un paso de trabajo CmdExec y ejecute el archivo de secuencia de comandos en el paso.

    Éste es un ejemplo:
    osql -E -i c:\script.sql
Cuando utiliza un archivo de secuencia de comandos, recibirá el mismo resultado si se ejecuta el lote mediante la utilidad osql que recibirá si se ejecuta el lote utilizando el Analizador de consultas SQL.

Al llamar a una instrucción RAISERROR con un nivel de gravedad de 20 o superior con la opción WITH LOG, la conexión para cerrar y todas las instrucciones que se debían ejecutar después de la llamada RAISERROR se omiten.

Estado

Microsoft ha confirmado que se trata de un problema de los productos de Microsoft enumerados en la sección "La información de este artículo se refiere a:". Este problema se corrigió por primera vez en Pack 4 de Microsoft SQL Server 2000.

Más información

Si el nivel de gravedad de mensaje de error en el paso de trabajo SQL Server Agent de la instrucción RAISERROR es de 2 a 9, el trabajo y el trabajo paso final con un resultado error. Sin embargo, el resultado no se suprime para las instrucciones que se ejecutan después de la instrucción RAISERROR en el lote.

Si el nivel de gravedad de mensaje de error en RAISERROR la instrucción es 10, 1 ó 0, el trabajo y el trabajo paso se ejecuta correctamente. Por lo tanto, no se produce el problema que se menciona en la sección "Síntomas" de este artículo.

Aunque el trabajo SQL Server Agent falla si ejecuta la misma secuencia de comandos SQL utilizando el Analizador de consultas SQL, la utilidad isql o de osql , recibirá el resultado que espera.

Pasos para reproducir el comportamiento

  1. Crear un nuevo trabajo SQL Server Agent con un paso de trabajo de la Secuencia de comandos de 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. En la ficha Avanzadas , en la sección Opciones de comando de secuencia de comandos de Transact-SQL (TSQL) , escriba C:\Raiserror.log en el cuadro archivo de resultados .
  4. Haga clic para seleccionar la opción Anexar .
  5. Haga clic en Aplicar y, a continuación, haga clic en Aceptar .
  6. Haga clic en Aplicar y, a continuación, haga clic en Aceptar .
  7. En el Administrador corporativo de SQL Server, haga clic con el botón secundario en el trabajo SQL Server Agent que se creó y, a continuación, haga clic en Iniciar trabajo .
  8. Iniciar seguimiento del Analizador SQL.
  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. Vuelva a ejecutar el trabajo.
Aquí es el resultado que se genera en el archivo 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]

En este archivo raiserror.log, puede ver que, con un nivel de gravedad de 10, todos los los resultados desde el trabajo se imprimen en el archivo de salida y el trabajo tenía un resultado correcto.

En este archivo raiserror.log, puede ver que, con un nivel de gravedad de 11, sólo los resultados de las dos primeras instrucciones se imprimen en el archivo de salida y el trabajo tenía un resultado error. Además, el mensaje RAISERROR es en un formato de mensaje de error en lugar de en un formato de un nivel de gravedad 10 informativo. El archivo de traza muestra que todas las instrucciones se ejecutaron correctamente.

Si cambia el nivel de gravedad a un número de 2 a 9, no se suprime el resultado y el resultado del trabajo producirá un error para el paso y para el trabajo. El formato de mensaje será el mismo como formato mensaje de error de nivel de gravedad 11 o superior.

Propiedades

Id. de artículo: 309802 - Última revisión: viernes, 02 de noviembre de 2007 - Versión: 5.5
La información de este artículo se refiere 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
Palabras clave: 
kbmt kbhotfixserver kbqfe kbqfe kbsqlserv2000presp4fix kbfix kbbug kbpending KB309802 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 309802

Enviar comentarios

 

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