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

use*_*816 1 batch-file sqlcmd

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

@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
Run Code Online (Sandbox Code Playgroud)

它给出了以下输出:

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 . . .
Run Code Online (Sandbox Code Playgroud)

我的期望是:

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

  2. 我不希望Echo关闭消息.

MC *_* ND 6

从MS文档:

错误报告选项

-b

指定sqlcmd退出并在发生错误时返回DOS ERRORLEVEL值.当SQL Server错误消息的严重性级别大于10时,返回到DOS ERRORLEVEL变量的值为1; 否则,返回的值为0.如果除了-b之外还设置了-V选项,则如果严重性级别低于使用-V设置的值,则sqlcmd不会报告错误.命令提示符批处理文件可以测试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%
Run Code Online (Sandbox Code Playgroud)

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

echo 
Run Code Online (Sandbox Code Playgroud)

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