我有以下位的VBS,通过SQLCMD调用并运行* .sql查询。
如何改进错误检查?如果我删除* .sql文件,它认为它已经成功完成,即使它已经没有。
Writelog "Attempting to run *.sql"
err = objshell.Run ("cmd /c sqlcmd -U sa -P Password -i c:\temp\abc.sql",1,FALSE)
If err <> 0 Then
WriteLog "Error running SQL = " & err & "(" & err.description & ")"
Else
WriteLog "Successfully run SQL"
End If
答案 0 :(得分:2)
正如@Noodles在您的问题的评论中指出的那样,您需要将Run
方法(bWaitOnReturn
)的第三个参数设置为True
,以便您的VBScript等待外部命令完成。
但是,仅靠这一点还不够。您还需要使用附加参数-b
运行sqlcmd
,以便在出现错误时返回非零退出代码:
<强>
-b
强>指定
sqlcmd
退出并在发生错误时返回DOS ERRORLEVEL值。返回给DOS ERRORLEVEL变量的值是 1 当SQL Server错误消息的严重性级别大于10时;否则,返回的值为 0 。如果除了-V
之外还设置了-b
选项,则sqlcmd
如果严重性级别低于使用-V
设置的值,则不会报告错误。命令提示符批处理文件可以测试ERRORLEVEL的值并适当地处理错误。 sqlcmd不报告严重性级别10(信息性消息)的错误。如果
sqlcmd
脚本包含错误的注释,语法错误或缺少脚本变量,则返回的ERRORLEVEL为1.
并且您不需要cmd /c
,因为您的外部命令不使用任何CMD内置功能(如内部命令,管道或重定向)。
此外,请勿使用err
作为变量名称。 VBScript具有内部全局对象Err
,用于提供运行时错误信息,在发生运行时错误时会自动填充该信息。尝试为其赋值应该会引发错误。
将您的代码更改为以下内容:
rc = objshell.Run("sqlcmd -b -U sa -P Password -i c:\temp\abc.sql", 1, True)
If rc <> 0 Then
WriteLog "Error running SQL = " & rc
Else
WriteLog "Successfully run SQL"
End If