web-dev-qa-db-fra.com

Comment faire sqlcmd retourner un ERRORLEVEL autre que 0 lorsque le script .sql échoue?

J'exécute sqlcmd à partir d'un fichier batch et je me demandais comment lui faire retourner un ERRORLEVEL autre que 0 lorsque quelque chose ne va pas avec la sauvegarde.

41
leeand00

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

http://msdn.Microsoft.com/en-us/library/ms162773.aspx

58
Ola Hallengren

Sur la page de l'utilitaire MSDN SQLCMD à: http://msdn.Microsoft.com/en-us/library/ms162773.aspx

Si RAISERROR est utilisé dans un script sqlcmd et qu'un état de 127 est levé, sqlcmd se fermera et renverra l'ID du message au client. Par exemple:

RAISERROR (50001, 10, 127)

Vous pouvez donc envelopper le BACKUP DATABASE... commande dans un TRY...CATCH bloquez et déclenchez le message d'erreur approprié, que sqlcmd retournerait ensuite dans votre fichier de commandes.

Par exemple, considérez les éléments suivants errorleveltest.sql fichier:

: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 plus de lisibilité, mais doit être 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 renvoie 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 voir, ERRORLEVEL 1 est renvoyé au lieu de la valeur de retour normale de 0. Je ne parviens pas à obtenir ERRORLEVEL pour refléter le numéro d'erreur réel, dans ce cas 50002; peut-être qu'il y a un problème dans mon code, ou peut-être qu'il y a un problème avec mon environnement.

10
Max Vernon