在for循环中执行sql文件,不记录错误,错误后不停止

时间:2013-08-20 12:34:32

标签: for-loop batch-file sqlcmd

在下面的批处理脚本中,我希望所有脚本都保存在c:\ temp中,它们将逐个执行并重新记录日志文件中的所有成功/错误记录,如果发生任何错误则应该停止 syntex在这里出错了,还有一个我将这个批处理脚本和所有sql脚本只保存在一个文件夹中

@Echo Off
FOR /f %%i IN ('DIR C:\temp\*.Sql /B') do call :RunScript %%i
GOTO :END

:RunScript
Echo Executing %1
@set SName=someservername
@set DbName=somedbname
@set path=C:\temp

echo sqlcmd -S %SName% -d %DbName% -i %1 -o "%path%\log.txt" 
if not %errorlevel%==0 exit
Echo Completed %1

:END

3 个答案:

答案 0 :(得分:0)

你需要在子程序结束时(在“Echo Completed%1”之后)转到:eof;否则你不会从被调用的子程序返回。您的代码也假定文件名中没有空格。是这样的吗?

答案 1 :(得分:0)

好的,我会首先指出错误,然后解决问题。我不知道sqlcmd,但我正在查看documentation

FOR /f %%i IN ('DIR C:\temp\*.Sql /B') do call :RunScript %%i

如果文件名在

中有空格,则可能会出现问题
@set path=C:\temp

如前所述,避免使用系统变量。 SQLCMD可能依赖%path%!

echo sqlcmd -S %SName% -d %DbName% -i %1 -o "%path%\log.txt" 

echo导致命令行显示,而不是执行! 从文档中,-o参数暗示“将覆盖先前sqlcmd会话中的同名文件”。因此,每次运行sqlcmd时,都会覆盖以前的日志。

if not %errorlevel%==0 exit

使用exit /b或命令行解释程序停止,这可能会在使用嵌套批处理时中断流程。

我的建议:

FOR /F "TOKENS=*" %%i IN ('DIR C:\temp\*.Sql /B') do call :RunScript "%%i"
GOTO :EOF

:RunScript
Echo Executing %1
SQLCMD -S someservername -d somedbname -i %1 -b -m-1 1>> "C:\temp\log.txt"
IF %ERRORLEVEL%==0 EXIT /B
Echo Completed %1

编辑:拼写错误

编辑:纠正开关:-o代表输出。更好地使用-m并抓住stdout

答案 2 :(得分:0)

表示(* .sql)中的%% G do(sqlcmd / S%sqlhost%/ d%sqldbname%-E -b -i“%% G”&gt;&gt;如果ERRORLEVEL 1退出则输出.txt)< / p>

上面的代码将循环遍历文件夹中的所有* .sql。如果在任何脚本中遇到错误,将在output.txt文件中记录错误,它将立即停止批处理。使用上面两行代码创建一个批处理文件并将其放在您的文件夹中(C:\ temp )