0

因此,我正在编写第一个使用 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 查询列表,然后将输出吐出到同名的文件中,然后可以将其连接到主输出中。

我遇到的问题是错误检查,特别是死锁。遇到死锁时, 我希望重新运行失败的查询,然后继续执行列表。

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

我已经尝试在重启器之外将另一个变量设置为 %%G 的值......虽然这有效,但一旦成功执行查询,它就会退出原始 FOR 循环并停止。

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

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

4

1 回答 1

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
于 2013-11-07T22:58:14.080 回答