所以我正在开发第一个使用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作为参数传递来使其工作。但是,如果没有单独的脚本,我仍然有兴趣知道是否有办法做到这一点。
答案 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