【问题标题】:executing sql files in for loop, error is not recorded and not stoping after error在for循环中执行sql文件,错误不记录,错误后不停止
【发布时间】:2013-08-20 12:34:31
【问题描述】:

在下面的批处理脚本中,我希望所有脚本都保存在 c:\temp 中,它们将一一执行并在日志文件中重新排列所有成功/错误记录,如果发生任何错误,则应该停止 这里有什么语法错误,还有一个我把这个批处理脚本和所有的 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

【问题讨论】:

  • 为什么echo 前面有sqlcmd?删除它!
  • 好的,我还是有同样的问题
  • 刚刚记住:当你@set path=C:\temp 时,你会导致shell 找不到sqlcmd.exe,除非它存在于当前目录或c:\temp

标签: for-loop batch-file sqlcmd


【解决方案1】:

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

【讨论】:

  • 这不正确。到达批处理文件的末尾与GOTO :EOF相同。
  • 假设 OP 已显示所有代码。如果以后添加更多代码,仍然最好添加 GOTO :eof。
  • 我也会这样做。但是,:END 意义重大!
  • 仍然日志文件变空白
【解决方案2】:

好的,我会先指出错误,然后解决。我不知道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 导致命令行显示,未执行! 从文档中,-oparameter 暗示“将覆盖来自先前 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

【讨论】:

  • 这个脚本得到了很大的改进,效果很好,但是 log.txt 创建为空白,我希望得到结果
  • 我有 5-10 个命令并且日志文件变得空白,我无法理解命令是否被执行?
  • 您必须阅读文档。 -o 存储输出。这应该只是 SQL 查询结果。
  • LS_dev,我按照你修改后的脚本完成了,仍然出现同样的错误,生成日志文件但它是空白的
【解决方案3】:

for %%G in (*.sql) do (sqlcmd /S %sqlhost% /d %sqldbname% -E -b -i "%%G" >> output.txt if ERRORLEVEL 1 exit)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-17
    • 2021-08-14
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多