如果批处理失败,请重试sql查询

时间:2016-06-16 06:57:50

标签: sql batch-file sqlcmd

此脚本处理给定文件夹中的所有sql文件,并将结果输出到csv。你有什么想法我怎么能适应它来重试sql文件,以防出现错误或失败?

@ECHO OFF

SET SQLCMD="C:\Program Files\Microsoft SQL Server\100\Tools\Binn\SQLCMD.EXE"
SET PATH="C:\Users\username\Desktop\Scripts\Reports\sql"
SET SERVER="localhost"
SET DB="database"
SET LOGIN="username"
SET PASSWORD="password"
SET OUTPUT="C:\Users\username\Desktop\Scripts\Reports\output_%date%-%time:~0,2%-%time:~3,2%-%time:~6,2%.csv"

CD %PATH%

ECHO %date% %time% > %OUTPUT%

for %%f in (*.sql) do (
%SQLCMD% -S %SERVER% -d %DB% -E -i  %%~f >> %OUTPUT% -W -w 1024 -s";")

谢谢!

1 个答案:

答案 0 :(得分:1)

您无法测试 ERRORLEVEL 环境变量。通常零 ERRORLEVEL 值意味着成功。您还需要启用延迟扩展以在块内检查它。

这样的事情可能有所帮助,

SetLocal EnableDelayedExpansion
for %%f in (*.sql) do (
  Set /a success=1
  for /L %%w in (1,1,5) do ( rem retry five times
    if !success! NEQ 0 (
       %SQLCMD% -S %SERVER% -d %DB% -E -i  %%~f >> %OUTPUT% -W -w 1024 -s";"
       if !ERRORLEVEL! EQU 0 set /a success=0
    )
  )
  if !success! NEQ 0 (
     rem sql failed, log or advise
  )
)
EndLocal

另一个重点,请注意 PATH 环境变量。你应该更好地使用另一个名称​​ SQL_PATH MY_PATH

或者您可以使用 PUSHD& POPD 更改您的工作目录

@echo off

SET ...

rem save current dir and jump to...
pushd "C:\Users\username\Desktop\Scripts\Reports\sql" 

for %%f in (*.sql) do (
   ...
   ...
)

rem restore dir saved by pushd
popd