Я запускаю sqlcmd из командного файла, и мне было интересно, как заставить его вернуть ERRORLEVEL, отличный от 0, когда что-то не так с резервной копией.
Я запускаю sqlcmd из командного файла, и мне было интересно, как заставить его вернуть ERRORLEVEL, отличный от 0, когда что-то не так с резервной копией.
Ответы:
Вы должны использовать опцию -b в sqlcmd.
-b Указывает, что sqlcmd завершает работу и возвращает значение DOS ERRORLEVEL при возникновении ошибки. Значение, которое возвращается в переменную DOS ERRORLEVEL, равно 1, если сообщение об ошибке SQL Server имеет уровень серьезности больше 10; в противном случае возвращается 0
Со страницы служебной программы MSDN SQLCMD по адресу: http://msdn.microsoft.com/en-us/library/ms162773.aspx.
Если RAISERROR используется в скрипте sqlcmd и состояние 127 поднято, sqlcmd завершит работу и вернет идентификатор сообщения обратно клиенту. Например:
RAISERROR (50001, 10, 127)
Таким образом, вы можете заключить BACKUP DATABASE...
команду в TRY...CATCH
блок и вызвать соответствующее сообщение об ошибке, которое sqlcmd
затем вернется в ваш командный файл.
Например, рассмотрим следующий errorleveltest.sql
файл:
: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
И следующий файл .bat: (первая строка переносится для удобства чтения, но должна быть в одной строке.)
@echo off
"C:\Program Files\Microsoft SQL Server\110\Tools\Binn\sqlcmd" -S "someinstance" -E
-i .\errorleveltest.sql
ECHO Errorlevel: %ERRORLEVEL%
Это возвращает следующее из моей подсказки 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
Как вы можете видеть, ERRORLEVEL 1 возвращается вместо обычного возвращаемого значения 0. Я не могу получить ERRORLEVEL, чтобы отразить фактический номер ошибки, в данном случае 50002; возможно, в моем коде есть проблема, или, возможно, есть какая-то проблема с моей средой.
ERRORLEVEL
не следует ожидать, чтобы оно совпадало с номером ошибки, сообщенным с SQL Server. ErrorNumber - это специфическое для SQL Server значение, указывающее, почему оно (т. Е. SQL Server) завершено. С другой стороны, ERRORLEVEL
это специфичное для SQLCMD значение, указывающее, почему оно (то есть SQLCMD) завершено.