J'exécute sqlcmd à partir d'un fichier de commandes et je me demandais comment lui faire renvoyer un ERRORLEVEL autre que 0 en cas de problème avec la sauvegarde.
J'exécute sqlcmd à partir d'un fichier de commandes et je me demandais comment lui faire renvoyer un ERRORLEVEL autre que 0 en cas de problème avec la sauvegarde.
Réponses:
Vous devez utiliser l'option -b dans sqlcmd.
-b Spécifie que sqlcmd se ferme et renvoie une valeur DOS ERRORLEVEL lorsqu'une erreur se produit. La valeur renvoyée à la variable DOS ERRORLEVEL est 1 lorsque le message d'erreur SQL Server a un niveau de gravité supérieur à 10; sinon, la valeur renvoyée est 0
De la page Utilitaire MSDN SQLCMD à l’ adresse : http://msdn.microsoft.com/en-us/library/ms162773.aspx
Si RAISERROR est utilisé dans un script sqlcmd et qu'un état de 127 est déclenché, sqlcmd se ferme et renvoie l'ID du message au client. Par exemple:
RAISERROR (50001, 10, 127)
Vous pouvez donc envelopper la BACKUP DATABASE...
commande dans un TRY...CATCH
bloc et générer le message d'erreur approprié, qui sqlcmd
sera ensuite renvoyé dans votre fichier de commandes.
Par exemple, considérons le errorleveltest.sql
fichier suivant :
:ON ERROR EXIT
BEGIN TRY
/* creates error 3147 Backup and restore operations
are not allowed on database tempdb */
BACKUP DATABASE tempdb;
END TRY
BEGIN CATCH
DECLARE @msg NVARCHAR(255);
SET @msg = 'An error occurred: ' + ERROR_MESSAGE();
RAISERROR (50002, 10, 127);
END CATCH
Et le fichier .bat suivant: (la première ligne est encapsulée pour des raisons de lisibilité, mais doit figurer sur une seule ligne.)
@echo off
"C:\Program Files\Microsoft SQL Server\110\Tools\Binn\sqlcmd" -S "someinstance" -E
-i .\errorleveltest.sql
ECHO Errorlevel: %ERRORLEVEL%
Cela retourne ce qui suit à partir de mon invite cmd.exe:
Msg 18054, Level 16, State 1, Server CP708-D377\MV, Line 9
Error 50002, severity 10, state 127 was raised, but no message with that error number
was found in sys.messages. If error is larger than 50000, make sure the user-defined
message is added using sp_addmessage.
Errorlevel: 1
Comme vous pouvez le constater, ERRORLEVEL 1 est renvoyé au lieu de la valeur de retour normale de 0. Je ne parviens pas à obtenir que ERRORLEVEL reflète le numéro d'erreur actuel, dans ce cas 50002; peut-être il y a un problème dans mon code, ou peut-être il y a un problème avec mon environnement.
ERRORLEVEL
ne devrait pas avoir la même valeur que le numéro d’erreur rapporté par SQL Server. ErrorNumber est une valeur spécifique à SQL Server indiquant la raison pour laquelle elle (SQL Server) s'est terminée. D'autre part, ERRORLEVEL
une valeur spécifique à SQLCMD indique pourquoi elle (c'est-à-dire SQLCMD) s'est terminée.