如果FOR循环中发生死锁,则重试OSQL命令

时间:2013-11-07 22:14:34

标签: batch-file osql

所以我正在开发第一个使用OSQL查询的批处理脚本。这是我目前的代码:

setlocal enableDelayedExpansion
FOR /F %%G in (names.txt) DO  (
    :RESTARTER
    osql -b -D PCRServer -r -h-1 -s "," -i %%G.sql -o C:\SQLQurey\out\%%G.txt -U     SOMEUSER -P SOMEPASS
    if !ERRORLEVEL! NEQ 0 goto RESTARTER

)
endlocal

这个想法是names.txt有一个要运行的sql查询列表,然后将输出吐出到一个具有相同名称的文件,然后可以将其连接到主输出。

我遇到的问题是错误检查,特别是死锁。遇到死锁时我想要发生的事情是重新运行失败的查询,然后继续列表。

我的想法是通过错误级别检查和转到,它会做我想要的。相反,当它跳回到:RESTARTER时,%% G的值丢失,我得到一个永久的错误循环。

我已经尝试将另一个变量设置为在重新启动程序之外的%% G的值...并且当这有效时,一旦查询成功执行,它将退出原始FOR循环并停止。

所以,我的问题是,如何告诉脚本重试上一个失败的命令并继续FOR循环直到到达names.txt的末尾?

编辑:好的,所以我能够通过将实际的osql命令放在一个单独的批处理文件中,然后从循环中调用该批处理并将%% G作为参数传递来使其工作。但是,如果没有单独的脚本,我仍然有兴趣知道是否有办法做到这一点。

1 个答案:

答案 0 :(得分:0)

这是我的建议。将MaxTrys更改为您喜欢的某个数字。完成此工作后,您可能需要考虑使用SQLCMD而不是OSQL。 OSQL已被弃用。当然,如果您使用的是SQL 2000,则需要使用OSQL。

@ECHO OFF
SET MaxTrys=10
FOR /F %%G in (names.txt) DO  (
   ECHO.G=%%G - Remove this line later if you don't need to see
   CALL :DoSQL "%%G"
)
PAUSE & REM Remove this line later
GOTO :eof

:DoSQL
FOR /L %%H in (1,1,%MaxTrys%) DO (
   osql -b -D PCRServer -r -h-1 -s "," -i %~1.sql -o C:\SQLQurey\out\%~1.txt -U     SOMEUSER -P SOMEPASS
   IF NOT ERRORLEVEL 1 GOTO :eof
)
ECHO.ERROR.  :DoSQL Failed %MaxTrys% times.
GOTO :eof