Sql-Server

當 .sql 腳本失敗時,如何使 sqlcmd 返回 0 以外的 ERRORLEVEL?

  • February 12, 2021

我正在從批處理文件執行 sqlcmd,我想知道當備份出現問題時如何使它返回 0 以外的 ERRORLEVEL。

您應該在 sqlcmd 中使用選項 -b。

-b 指定 sqlcmd 在發生錯誤時退出並返回 DOS ERRORLEVEL 值。當 SQL Server 錯誤消息的嚴重級別大於 10 時,返回給 DOS ERRORLEVEL 變數的值為 1;否則,返回值為 0

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

從 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;也許我的程式碼有問題,或者我的環境有問題。

引用自:https://dba.stackexchange.com/questions/77298