error handling与batch file和Sqlcmd

我有一个使用sqlcmd运行一些SELECT查询的batch file,将结果放到文本文件中,并将这些file upload到FTP服务器上。 这一切都按照自己的方式工作,这就是我喜欢做事的方式。

不过,我一直在想我会在发生错误时做些什么。 比方说,有人改变我打的数据库的数据结构,并没有通知我。 如果我运行一个sqlcmd SELECT语句,并将结果放到一个文本文件中,我最终会得到一个包含错误的文本文件,然后直接进入FTP,就像没有错误一样。 (我testing过了。)

我希望能够检查来自sqlcmd的错误 – 超时,错误凭据,格式错误的查询等等,我只是不知道这是如何做的或“最佳实践”是什么。 我总是可以尝试抓取输出的文本文件并search我认为可能发生的错误,但是由于许多原因,这是有问题的。

任何人都有任何经验,他们会喜欢分享?

您可以检查从SQLCMD返回的错误errorlevel ,看它是否失败。

  sqlcmd -b <yourscript> IF ERRORLEVEL 1 goto err_handler goto done :err_handler REM handle the error here :done REM script completion code here 

我可能会开始把你的SQL中的返回值,如下所示:

 DECLARE @IsBored bit = 1 ... do work ... SELECT 0 -- Success! 

您可以进一步使用TRY / CATCH块来捕获错误并返回错误代码。 使用SQLCMD,可以使用SQL中的返回代码作为应用程序的退出代码,如下所示:

 sqlcmd -b -S serverName -E -d DbName -q "EXIT(EXEC dbo.YourProc)" -o "C:\Logs\output.log" -u 

如果您使用某个调度程序来管理SQLCMD调用,则可以根据SQLCMD返回的代码采取行动。 既然你只是使用批处理文件,我认为你可以做这样的事情:

 @ECHO OFF sqlcmd -b -S serverName -E -d DbName -q "EXIT(EXEC dbo.YourProc)" -o "C:\Logs\output.log" -u IF %ERRORLEVEL% NEQ 0 ECHO "Error" 

祝你好运!

 for %%G in (*.sql) do (sqlcmd /S %sqlhost% /d %sqldbname% -E -b -i "%%G" >> output.txt if ERRORLEVEL 1 exit) 

上面的代码将遍历文件夹中的所有* .sql。 如果在脚本中遇到任何错误,则会在output.txt文件中记录错误,并立即停止批处理。

我在Python中构建了一个小型语言来解决类似的问题。 使用子进程库,您可以通过sqlcmd运行您的代码,然后获取输出和任何错误代码。 在将输出放入文本文件之前解析输出,并在必要时进行错误修复状态。 这些状态可以修改代码或选项,然后重试通过sqlcmd发送它们。 如果一切都失败了,给一个人发邮件。

当然,因为我是这样使用python的,所以我根本就不打算使用sqlcmd,只是使用odbc python库直接连接数据库。 如果发生灾难性故障,我可以回滚交易,以交互模式或通过命令文件等方式运行。

这是一堆工作。 为了更简单的错误检查,只需在你的管道中添加一个过滤器,比如说grep或者awk。 或者用flex来滚动自己。