我有一个批处理文件,使用sqlcmd运行一些SELECT查询,将结果放入文本文件,并将这些文件上传到FTP服务器。这一切都正常运作,这就是我喜欢的方式。
我一直想知道在发生错误时我会怎么做。假设某人更改了我正在点击的数据库的数据结构,但没有通知我。如果我运行sqlcmd SELECT语句并将结果放入文本文件中,我最终会得到一个包含错误的文本文件,然后直接进入FTP就好像没有错。 (我已经测试了这个。)
我希望能够检查来自sqlcmd的错误 - 超时,错误的凭据,格式错误的查询等等,我只是不确定这是怎么做的或者“最佳实践”是什么。我总是可以尝试抓取输出文本文件并搜索我认为可能发生的错误,但出于各种原因这是有问题的。
任何人都有这方面的经验,他们想分享?
答案 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滚动自己。