运行sqlcmd后命令提示符错误级别问题

时间:2012-05-30 22:55:54

标签: cmd command-prompt sqlcmd errorlevel

我的代码如下:

CALL:ECHOCOLOR "Executing on server:[S059D526\TCH] db:CS filename:[9990294_UPDATE_Concessions.sql]." Cyan
SET CURRENT_SCRIPT="9990294_UPDATE_Concessions.sql"
if not exist "9990294_UPDATE_Concessions.sql" (
  CALL:ECHOCOLOR "skipping execution of file [9990294_UPDATE_Concessions.sql].  Possibly it was renamed because it has already ran" Yellow
)
if exist "9990294_UPDATE_Concessions.sql" (
  CALL:ECHOCOLOR "executing script [9990294_UPDATE_Concessions.sql]" Cyan
  sqlcmd -V 1 -r1 -E -S S059D526\TCH -d "CS" -i "9990294_UPDATE_Concessions.sql" -o "9990294_UPDATE_Concessions.sql.run_20120508_12_19_36.log"
)
CALL:ECHORESULT "result [OK=0,ERR=any other]: %errorlevel%" %errorlevel%
if NOT ERRORLEVEL 0 GOTO FINAL_ERROR
if exist "9990294_UPDATE_Concessions.sql" rename "9990294_UPDATE_Concessions.sql" "9990294_UPDATE_Concessions.sql.ok"

我面临的问题是errorlevel,因为在运行数据库脚本后,它总是返回0.这是因为指令CALL:ECHORESULT "result [OK=0,ERR=any other]: %errorlevel%" %errorlevel%。如果脚本运行时出错,则永远不会转到FINAL_ERROR。当我遇到脚本错误时,我不知道如何进行验证以停止进程。

1 个答案:

答案 0 :(得分:1)

您的错误检查逻辑错误。

如果errorlevel为> = N,则

IF ERRORLEVEL N为真。因此IF NOT ERRORLEVEL 0永远不会成立! (假设错误级别不是负数)。

你想要

if ERRORLEVEL 1 goto FINAL_ERROR

if %ERRORLEVEL% neq 0 goto FINAL_ERROR

另一件事。你真的应该在你试图测试的命令后立即测试ERRORLEVEL。我不知道:ECHORESULT例程是如何编码的,但它可能会改变当前的ERRORLEVEL值。