用于在目录中执行SQL脚本的批处理脚本

时间:2017-03-09 14:29:33

标签: sql batch-file

我想开发一个批处理脚本,它将执行放置批处理文件的文件夹中的每个.sql SQL脚本,并将日志记录到filename_sqloutput.txt文件中。 条件是:如果任何脚本提供任何错误消息,如列名不正确或表名等。脚本执行应立即停止,不应执行更多脚本。

我尝试使用以下代码:但即使脚本在输出文件中出错,它也无法正常工作。脚本执行没有停止..

需要你的帮助!!!

@echo off
for /f %%a IN ('dir /b *.sql') do (call sqlcmd -S AMRVSP000000318 -i %%a  -o"%%~na_sqloutput.txt" 

findstr "Msg" %%~na_sqloutput.txt >nul & if %errorlevel% EQU 1 (exit)  else (echo Successfully executed %%~na_sqloutput.txt) 
)
pause

2 个答案:

答案 0 :(得分:0)

....如果errorlevel 1(退出......

%errorlevel%是遇到errorlevelfor的初始值。

请参阅有关使用delayed expansion作为另一种解决方案的无休止的SO文章。

此语法表示"如果当前errorlevel为1或更大,则其他地址为#34;

答案 1 :(得分:0)

FINDSTR will set %ERRORLEVEL% as follows

  
      
  • 0(False)在至少一个文件的至少一行中找到匹配。
  •   
  • 1(True)如果在任何文件的任何行中找不到匹配项(或者根本找不到该文件)。
  •   
  • 2语法错误
  •   
     

无效开关仅在错误流中打印错误消息。

此外,请关注EnableDelayedExpansion文章并将脚本重写为更具可读性的结构:

@echo off
SETLOCAL EnableExtensions EnableDelayedExpansion
for /f %%a IN ('dir /b *.sql') do (
    call sqlcmd -S AMRVSP000000318 -i %%a  -o"%%~na_sqloutput.txt" 

    findstr "Msg" "%%~na_sqloutput.txt" 2>NUL
    if !errorlevel! EQU 0 (
        echo error occured %%~na_sqloutput.txt
        rem pause to see error
        pause
        exit /B
    ) else (
        echo Successfully executed %%~na_sqloutput.txt
    ) 
)
pause