Я запускаю 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 вийде і поверне ідентифікатор повідомлення назад клієнту. Наприклад:
РАЙЗЕР (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) припиняється.