17

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

不过,我一直想知道如果发生错误我会怎么做。假设有人更改了我正在访问的数据库的数据结构并且没有通知我。如果我运行一个 sqlcmd SELECT 语句并将结果放入一个文本文件中,我最终会得到一个包含错误的文本文件,然后它会直接进入 FTP,就好像没有任何问题一样。(我已经对此进行了测试。)

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

有人有这方面的经验愿意分享吗?

4

4 回答 4

16

您可以检查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
于 2011-04-26T19:36:51.460 回答
10

我可能会先将返回值放入您的 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"

祝你好运!

于 2011-04-26T19:38:08.667 回答
2
for %%G in (*.sql) do (sqlcmd /S %sqlhost% /d %sqldbname% -E -b -i "%%G" >> output.txt if ERRORLEVEL 1 exit)

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

于 2014-02-14T05:20:31.487 回答
-6

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

当然,由于我使用的是这样的python,我根本没有理会sqlcmd,只是使用odbc python库直接连接到数据库。如果发生灾难性故障,我可以回滚我的事务,以交互模式或通过命令文件等运行它。

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

于 2011-04-26T19:43:08.417 回答