: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
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
您应该在 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
BACKUP DATABASE...
因此,您可以将命令包装在一个TRY...CATCH
块中并引发相应的错误消息,sqlcmd
然后该错误消息将返回到您的批处理文件。例如,考虑以下
errorleveltest.sql
文件:以及以下 .bat 文件:(为了便于阅读,第一行被换行,但需要在一行上。)
这将从我的 cmd.exe 提示符返回以下内容:
如您所见,返回的是 ERRORLEVEL 1 而不是正常的返回值 0。我无法让 ERRORLEVEL 反映实际的错误编号,在本例中为 50002;也许我的代码有问题,或者我的环境有问题。
我用这个命令解决了这个问题