【问题标题】:Batch file not logging SQL errors批处理文件不记录 SQL 错误
【发布时间】:2020-07-30 07:33:41
【问题描述】:

我正在尝试使用 sqlcmd 实用程序执行 4000 多个(约 140GB)脚本。

这样做的原因是从 SQL Server 2017 到 2008 的所有导出选项都因错误而失败,因此我决定使用 SSMS 中的“生成脚本”为整个数据库编写脚本,然后通过批处理文件执行所有生成的脚本,然后记录每个错误,以便我可以查明每个脚本中的问题是(或不是)。

到目前为止,我设法确定 2008 年并不真正喜欢某些表中的日期格式,这很奇怪,因为该数据库是今年早些时候从 SQL SRV 2008 导出到 2017 年的。

反正我写的bach脚本是这样的:

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

if not %errorlevel% == 0 echo %errorlevel% >> errorlog.txt 2>&1
if %errorlevel% == 0 sqlcmd /S SQLINSTANCE /d DBNAME -E -i"%%G"

)

pause

脚本正确执行(一次插入 1 行),但创建和附加“errorlog.txt”除外 - 这个文件甚至没有在进程中创建,当我尝试手动创建它时,没有附加任何内容到这个文件。当我尝试在第 4 行创建“successlog.txt”时,该文件已正确创建并附加。

请问有人对我现在可以采取的步骤有任何指导吗?

【问题讨论】:

  • 你正在检查ErrorLevel(实际上是由于缺少delayed expansion而错误,但是什么命令?
  • 我想检查循环执行的上述 SQL 脚本的错误级别。我对批处理文件真的很陌生,所以我把它放在一起
  • for %%G in (*.sql) do ( … ) 枚举(或列出或循环)SQL脚本,但它确实执行它们,因此没有ErrorLevel价值……
  • 在这种情况下 - 请从 sql cmd 获取 ErrorLevel 值的最佳方法是什么?
  • 不太喜欢日期格式,这可能是一个错误的假设和“跳到结论”。更有可能是您的环境没有安装相同的选项集,并且您的代码对日期文字的格式做出了假设。但我假设您实际上将日期存储在一种相关的数据类型中,而不是作为字符串或数字。

标签: sql-server batch-file cmd sqlcmd


【解决方案1】:

您可以在 BAT 文件中调用子任务,并检查那里的错误级别。方法如下:

@Echo Off
:: Making sure the errorlevel is zero by listing all files in current folder 
:: without showing them.
dir >Nul 2>&1
:: This loop calls the subtask with the G-parameter, ie. the SQL-file path.
for %%G in (*.sql) do (
   call :my_subtask "%%~G"
)
:: Skipping to the end -section.
goto :end

:my_subtask
if %errorlevel% NEQ 0 echo %errorlevel% >> errorlog.txt 2>&1
if %errorlevel% EQU 0 sqlcmd /S SQLINSTANCE /d DBNAME -E -i "%~1"
:: NOTE the path of the SQL-file is now in the %1 -parameter.
:: It is good practice to use the "%~1" notation.
:: 
:: Returning to for-loop.
goto :EOF

:end
@Echo On

但是,我会将子任务编码为有点不同,如下所示:

:my_subtask
@Echo on
sqlcmd /S SQLINSTANCE /d DBNAME -E -i "%~1" >> successlog.txt 2>>errorlog.txt
@Echo off
if %errorlevel% NEQ 0 (
   Echo %~0 The subtask calling %~1 failed, errorlevel was %errorlevel% 
)
goto :EOF

【讨论】:

    猜你喜欢
    • 2016-06-28
    • 1970-01-01
    • 2017-10-29
    • 2010-11-12
    • 2022-01-23
    • 1970-01-01
    • 2018-04-21
    • 2016-04-13
    • 1970-01-01
    相关资源
    最近更新 更多