Sql-Server
當 .sql 腳本失敗時,如何使 sqlcmd 返回 0 以外的 ERRORLEVEL?
我正在從批處理文件執行 sqlcmd,我想知道當備份出現問題時如何使它返回 0 以外的 ERRORLEVEL。
您應該在 sqlcmd 中使用選項 -b。
-b 指定 sqlcmd 在發生錯誤時退出並返回 DOS ERRORLEVEL 值。當 SQL Server 錯誤消息的嚴重級別大於 10 時,返回給 DOS ERRORLEVEL 變數的值為 1;否則,返回值為 0
從 MSDN SQLCMD 實用程序頁面:http: //msdn.microsoft.com/en-us/library/ms162773.aspx
如果在 sqlcmd 腳本中使用 RAISERROR 並引發狀態 127,則 sqlcmd 將退出並將消息 ID 返回給客戶端。例如:
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;也許我的程式碼有問題,或者我的環境有問題。