Sto eseguendo sqlcmd da un file batch e mi chiedevo come farlo restituire un ERRORLEVEL diverso da 0 quando qualcosa non va nel backup.
Sto eseguendo sqlcmd da un file batch e mi chiedevo come farlo restituire un ERRORLEVEL diverso da 0 quando qualcosa non va nel backup.
Risposte:
Dovresti usare l'opzione -b in sqlcmd.
-b Specifica che sqlcmd esce e restituisce un valore DOS ERRORLEVEL quando si verifica un errore. Il valore restituito alla variabile DOS ERRORLEVEL è 1 quando il messaggio di errore di SQL Server ha un livello di gravità maggiore di 10; in caso contrario, il valore restituito è 0
Dalla pagina Utilità MSQ SQLCMD all'indirizzo: http://msdn.microsoft.com/en-us/library/ms162773.aspx
Se RAISERROR viene utilizzato all'interno di uno script sqlcmd e viene generato uno stato di 127, sqlcmd verrà chiuso e restituirà l'ID del messaggio al client. Per esempio:
RAISERROR (50001, 10, 127)
Quindi potresti avvolgere il BACKUP DATABASE...
comando in un TRY...CATCH
blocco e sollevare il messaggio di errore appropriato, che sqlcmd
tornerebbe al tuo file batch.
Ad esempio, considerare il seguente errorleveltest.sql
file:
: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
E il seguente file .bat: (la prima riga è racchiusa per leggibilità, ma deve essere su una sola riga.)
@echo off
"C:\Program Files\Microsoft SQL Server\110\Tools\Binn\sqlcmd" -S "someinstance" -E
-i .\errorleveltest.sql
ECHO Errorlevel: %ERRORLEVEL%
Ciò restituisce quanto segue dal mio prompt di 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
Come puoi vedere, viene restituito ERRORLEVEL 1 invece del normale valore di ritorno di 0. Non riesco a far sì che ERRORLEVEL rifletta il numero di errore effettivo, in questo caso 50002; forse c'è un problema nel mio codice o forse c'è qualche problema con il mio ambiente.
ERRORLEVEL
non dovrebbe essere previsto lo stesso valore del numero di errore riportato da SQL Server. ErrorNumber è un valore specifico di SQL Server per indicare il motivo per cui (ovvero SQL Server) è stato terminato. D'altra parte, ERRORLEVEL
è un valore specifico di SQLCMD per indicare il motivo per cui (ovvero SQLCMD) è terminato.