使用批处理文件进行错误处理& SQLCMD

时间:2011-04-26 19:28:53

标签: windows error-handling batch-file sqlcmd

我有一个批处理文件,使用sqlcmd运行一些SELECT查询,将结果放入文本文件,并将这些文件上传到FTP服务器。这一切都正常运作,这就是我喜欢的方式。

我一直想知道在发生错误时我会怎么做。假设某人更改了我正在点击的数据库的数据结构,但没有通知我。如果我运行sqlcmd SELECT语句并将结果放入文本文件中,我最终会得到一个包含错误的文本文件,然后直接进入FTP就好像没有错。 (我已经测试了这个。)

我希望能够检查来自sqlcmd的错误 - 超时,错误的凭据,格式错误的查询等等,我只是不确定这是怎么做的或者“最佳实践”是什么。我总是可以尝试抓取输出文本文件并搜索我认为可能发生的错误,但出于各种原因这是有问题的。

任何人都有这方面的经验,他们想分享?

4 个答案:

答案 0 :(得分:12)

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

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

    :done 
    REM script completion code here

答案 1 :(得分:9)

我可能会开始在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"
祝你好运!

答案 2 :(得分:2)

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

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

答案 3 :(得分:-5)

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

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

这是一堆工作。要进行更简单的错误检查,只需在管道中添加一个过滤器,例如grep或awk。或者使用flex滚动自己。