在批量失败的情况下重试 sql 查询

Retry a sql query in case of failure in batch

此脚本处理给定文件夹中的所有 sql 文件并将结果输出到 csv。您有什么想法吗?如果出现错误或失败,我该如何调整它以重试 sql 文件?

@ECHO OFF

SET SQLCMD="C:\Program Files\Microsoft SQL Server0\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";")

谢谢!

您无法测试 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_PATHMY_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