CORRECTIF : un appel à une instruction RAISERROR dans un lot d'instructions Transact-SQL peut provoquer un travail SQLAgent à échouer et à perdre sortie SQL Server

Traductions disponibles Traductions disponibles
Numéro d'article: 309802 - Voir les produits auxquels s'applique cet article
important Cet article contient des informations sur la modification du Registre. Veillez à sauvegarder le Registre avant de le modifier. Vérifiez que vous connaissez comment restaurer le Registre si un problème se produit. Pour plus d'informations sur la façon sauvegarder, restaurer et modifier le Registre, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
256986 Description du Registre Microsoft Windows
Agrandir tout | Réduire tout

Sommaire

Symptômes

Lorsqu'un type d'étape SQLAgent travail est script Transact-SQL et les instructions dans le champ commande de la nouvelle étape - < Nom Instance SQL Server >boîte de dialogue boîte appel une instruction RAISERROR Transact-SQL avec un niveau de gravité de 11 ou supérieure sans l'option WITH journal, le travail se termine avec le résultat a échoué. Cependant, bien que toutes les instructions Transact-SQL exécutée après l'instruction RAISERROR appel s'exécute, la sortie est supprimée. Par conséquent, aucune sortie n'est généré pour les relevés après le RAISERROR instruction s'exécute. Cela peut entraîner réellement confusion sur Qu'est devenu les instructions dans un travail. Vous devez examiner une trace du Générateur de profils SQL si vous souhaitez voir que réellement exécuté. Pour plus d'informations sur une trace du Générateur de profils, consultez la rubrique Générateur de profils dans la documentation en ligne de SQL Server.

Résolution

Avertissement Des problèmes graves peuvent se produire si modification incorrecte du Registre à l'aide de l'Éditeur du Registre ou en utilisant une autre méthode. Ces problèmes peuvent obliger à réinstaller votre système d'exploitation. Microsoft ne peut pas garantir que ces problèmes peuvent être résolus. Modifier le Registre à vos risques et périls.

Informations sur le service pack

Pour résoudre ce problème, procurez-vous le dernier service pack Microsoft SQL Server 2000. Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
290211 Comment obtenir le dernier pack de service SQL Server 2000

Informations sur le correctif

La version anglaise de ce correctif dispose les attributs de fichier (ou attributs de fichier version ultérieure) répertoriés dans le tableau suivant. Les dates et heures de ces fichiers sont exprimées en temps universel coordonné (UTC). Lorsque vous affichez les informations de fichier, il est convertie en heure locale. Pour connaître le décalage entre l'heure UTC et l'heure locale, utilisez l'onglet Fuseau horaire dans l'outil Date et heure du Panneau de configuration.
   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
note En raison des dépendances de fichiers, la fonctionnalité qui contient ces fichiers ou correctif plus récent peut également contenir des fichiers supplémentaires.

Après avoir appliqué ce correctif, le comportement de SQL Server Agent est défini par un nouveau Registre valeur DWORD qui est appelée TruncateJobResultOnError dans une des sous-clés de Registre suivantes :
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQLServer\SQLServerAgent (default instance)
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\<InstanceName>\SQLServerAgent (named instance)
Pour activer le nouveau comportement, définissez cette valeur TruncateJobResultOnError à 0. Après le redémarrage de SQL Server Agent, travail résultats seront plus tronqués par raiserror relevés. Pour restaurer le comportement hérité, vous pouvez définir la valeur TruncateJobResultOnError à 1. Ceci est la valeur par défaut si la valeur n'est pas définie.

Avertissement La modification de valeur 0 ne soient pas une approche efficace lorsqu'il y a un script qui a une boucle infinie avec l'erreur est générée. Agent enregistre les erreurs en continu et peut utiliser tout l'espace disque.

Contournement

Pour contourner le problème, appliquez l'une des méthodes suivantes, selon vos besoins.

Méthode 1

Déterminer le niveau de gravité à utiliser
  • Si vous voulez appeler une instruction RAISERROR à titre informatif, vous devez utiliser un niveau de gravité de 10 pour le message d'erreur. Un niveau de gravité de 10 représente un message d'information qui indique qu'un problème est survenu car l'utilisateur entré des informations incorrectes.
  • Si vous souhaitez annuler le lot lorsqu'une instruction RAISERROR est appelée, vous devez utiliser un niveau de gravité de 20 ou supérieure pour le message d'erreur, et vous devez inclure l'option WITH journal avec l'instruction RAISERROR. Lorsque vous effectuez cette opération, toutes les instructions Transact-SQL qui ont été supposé pour s'exécuter après que l'appel de l'instruction RAISERROR sont abandonné et toutes les transactions ouvertes sont automatiquement annulées.

    Pour plus d'informations sur les niveaux de gravité, consultez la rubrique « Error message gravité niveaux » dans la documentation en ligne de SQL Server.

Méthode 2

Utiliser un fichier de script dans l'étape de travail
Si le script entier pour exécuter indépendamment de la fréquence à laquelle l'instruction RAISERROR est appelée et le niveau de gravité est inférieure à 20, vous pouvez utiliser un fichier de script dans l'étape de travail. Pour ce faire, procédez comme suit :
  1. Enregistrez le script dans un fichier.
  2. Créer un travail SQL Server Agent avec une étape de travail CmdExec, puis exécutez le fichier de script dans l'étape.

    Voici un exemple :
    osql -E -i c:\script.sql
Lorsque vous utilisez un fichier de script, vous recevrez le même résultat si le lot est exécuté par l'aide de l'utilitaire osql qui s'affiche si le lot est exécuté à l'aide de l'Analyseur de requêtes SQL.

L'appel d'une instruction RAISERROR avec un niveau de gravité de 20 ou supérieur avec l'option de journal avec déclenche la connexion à fermer et tous les états qui étaient censés pour s'exécuter après que l'appel RAISERROR sont ignorés.

Statut

Microsoft a confirmé que c'est un problème dans les produits Microsoft répertoriés dans la section « S'applique à ». Ce problème a été corrigé dans Microsoft SQL Server 2000 Service Pack 4.

Plus d'informations

Si le niveau de gravité de le message d'erreur dans l'étape de travail SQL Server Agent de l'instruction RAISERROR est 2 à 9, le travail et l'étape de travail se terminer par un résultat a échoué. Toutefois, la sortie n'est pas supprimée pour les instructions sont exécutées après l'instruction RAISERROR dans le lot.

Si le niveau de gravité de le message d'erreur dans le RAISERROR instruction est 10, 1 ou 0, le travail et l'étape de travail s'exécute correctement. Par conséquent, le problème mentionné dans la section « Symptômes » de cet article ne se produit pas.

Bien que le travail SQL Server Agent échoue si vous exécutez le script SQL même à l'aide de l'Analyseur de requêtes SQL, de l'utilitaire isql ou de l'utilitaire osql , vous recevrez le résultat que vous attendez.

Procédure pour reproduire le problème

  1. Créer un nouveau travail SQL Server Agent avec une étape de travail Transact-SQL Script (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. Sous l'onglet Avancé , sous la section options de commande script Transact-SQL (TSQL) , tapez C:\Raiserror.log dans la zone fichier de sortie .
  4. Cliquez pour sélectionner l'option Ajouter .
  5. Cliquez sur Appliquer , puis cliquez sur OK .
  6. Cliquez sur Appliquer , puis cliquez sur OK .
  7. Dans SQL Server Enterprise Manager, cliquez avec le bouton droit sur le travail SQL Server Agent qui a été créé, puis cliquez sur Démarrer la tâche .
  8. Démarrez la trace du Générateur de profils 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. Exécutez à nouveau le travail.
Ici, est le résultat qui est généré dans le fichier 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]

Dans ce fichier raiserror.log, vous constatez que, avec un niveau de gravité de 10, tous les résultats du travail a été imprimé dans le fichier de sortie et le travail a un résultat positif.

Dans ce fichier raiserror.log, vous constatez qu'avec un niveau de gravité du 11, seulement la sortie dans les deux premières instructions a été imprimée dans le fichier de sortie, et le travail a un résultat a échoué. En outre, le message RAISERROR est sous un format message d'erreur au lieu de dans un format d'information d'un niveau de gravité 10. Le fichier de trace indique que tous les relevés exécuté avec succès.

Si vous modifiez le niveau de gravité à un nombre de 2 à 9, le résultat n'est pas supprimé et le résultat de travail échouera pour l'étape et le travail. Le format du message sera la même comme format message d'erreur pour le niveau de gravité 11 ou supérieure.

Propriétés

Numéro d'article: 309802 - Dernière mise à jour: vendredi 2 novembre 2007 - Version: 5.5
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft SQL Server 2000 Édition Développeur
  • Microsoft SQL Server 2000 Standard
  • Microsoft SQL Server 2000 Édition Entreprise
  • Microsoft SQL Server 2000 Édition Personelle
  • Microsoft SQL Server 2000 Workgroup Edition
  • Microsoft SQL Server 2000 Desktop Engine (Windows)
  • Microsoft SQL Server 2000 Enterprise Edition 64-bit
Mots-clés : 
kbmt kbhotfixserver kbqfe kbqfe kbsqlserv2000presp4fix kbfix kbbug kbpending KB309802 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 309802
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

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