批处理文件中的错误级别无法正常工作

时间:2015-03-12 06:07:24

标签: batch-file sqlcmd

我尝试使用带有批处理脚本的sqlcmd删除数据库。我遇到的问题是,如果sql中没有mytest数据库,代码就不会进入错误处理程序块。

@echo off
@echo IF ELSE DEMO
sqlcmd -S <servername> -U <username> -P <password> -Q "DROP DATABASE Mytest"  
IF ERRORLEVEL 1 goto err_handler
goto done

:err_handler
echo handle the error here
goto end

:done 
echo script completion code here

:end
@echo %Message%
pause

并提供以下输出:

IF ELSE DEMO
Msg 3701, Level 11, State 1, Server HERCULES, Line 1
Cannot drop the database 'Mytest', because it does not exist or you do not have permission.
script completion code here
ECHO is off.
Press any key to continue . . .

我的期望是:

  1. 如果数据库可用,它应该删除数据库并输入:done code如果数据库不可用则应输入:err_handler block。

  2. 我不想让Echo离开。

1 个答案:

答案 0 :(得分:5)

来自MS documentation

  

错误报告选项

     

<强> -b

     

指定sqlcmd退出并在何时返回DOS ERRORLEVEL值   发生错误。返回到DOS ERRORLEVEL的值   当SQL Server错误消息具有严重性级别时,变量为1   大于10;否则,返回的值为0.如果是-V选项   除了-b之外还设置了sqlcmd,如果是,则不会报告错误   严重性级别低于使用-V设置的值。命令提示符   批处理文件可以测试ERRORLEVEL的值并处理错误   适当。 sqlcmd不报告严重性级别10的错误   (信息性消息)。

     

如果sqlcmd脚本包含不正确的注释,语法错误或   缺少脚本变量,返回的ERRORLEVEL为1。

     

-m error_level

     

控制将哪些错误消息发送到stdout。有的消息   发送大于或等于此级别的严重性级别。   当此值设置为-1时,所有消息都包含信息   消息,发送。 -m和-1之间不允许有空格。对于   例如,-m-1有效,-m -1不有。

     

此选项还设置sqlcmd脚本变量SQLCMDERRORLEVEL。   此变量的默认值为0.

     

-V error_severity_level

     

控制用于设置ERRORLEVEL的严重性级别   变量。严重性级别大于或的错误消息   等于此值设置ERRORLEVEL。小于0的值是   报告为0.批处理和CMD文件可用于测试值   ERRORLEVEL变量。

您需要使用相应的值来从数据库中获取错误。如果没有它们,您看到的errorlevel被称为执行的sqlcmd实例(应该是0,因为它已成功执行),而不是数据库中运行的命令。

此外,正如已经评论过的那样,ECHO is off.消息由您的

生成
echo %Message%

变量undefined。该行被解析并转换为

echo 

因为%Message%没有价值。没有参数的echo命令的行为是输出echo状态。