在批处理脚本中使用sqlcmd来运行带有输出文件的多个脚本

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在批处理脚本中使用sqlcmd来运行带有输出文件的多个脚本相关的知识,希望对你有一定的参考价值。

我需要使用批处理文件中的sqlcmd在一个文件夹中运行大约50个脚本。每个脚本的查询结果都需要发送到自己的输出文件。我有一个工作批处理文件,它只是从一个单独的行运行:

sqlcmd -S %INSTANCE% -d %DATABASE% -U %USERNAME% -P "%PASSWORD%" -i "%SCRIPTFOLDER%\master_departments.sql" -s "|" -o "%OUTPUTFOLDER%\master_departments.csv" -W
sqlcmd -S %INSTANCE% -d %DATABASE% -U %USERNAME% -P "%PASSWORD%" -i "%SCRIPTFOLDER%\master_companies.sql" -s "|" -o "%OUTPUTFOLDER%\master_companies.csv" -W
sqlcmd -S %INSTANCE% -d %DATABASE% -U %USERNAME% -P %PASSWORD% -i "%SCRIPTFOLDER%\bill_history.sql" -s "|" -o "%OUTPUTFOLDER%\bill_history.csv" -W
sqlcmd -S %INSTANCE% -d %DATABASE% -U %USERNAME% -P %PASSWORD% -i "%SCRIPTFOLDER%\episodes.sql" -s "|" -o "%OUTPUTFOLDER%\episodes.csv" -W

有没有办法在某种循环中运行它?我见过在一个文件夹中运行所有SQL脚本循环的例子,但我见过的任何东西都没有输出文件集。

根据@LotPings的建议,我使用了以下代码:

set INSTANCE=<someinstance>
set DATABASE=<somedb>
set USERNAME=<someuser>
set PASSWORD=<somepassword>
set "SCRIPTFOLDER=D:\<pathToScripts>\"
set "OUTPUTFOLDER=D:\<pathForOutput>\"

@Echo off
For /F "tokens=*" %%S in ('Dir /B "%SCRIPTFOLDER%*.sql" '
) do echo sqlcmd -S %INSTANCE% -d %DATABASE% -U %USERNAME% -P "%PASSWORD%" -i "%%~fS" -s "|" -o "%%~dpnS.csv" -W

@pause

我在一个批处理文件中运行它,当它暂停时,最后一行说:“系统找不到指定的文件。”

认为它可能是我的路径中的反斜杠,我删除它们并在.sql线的for之前放一个斜线,但我得到了相同的结果。

当我像这样运行它时,完全删除反斜杠导致“找不到文件”消息。

答案

如果您的输出文件名与脚本名称匹配(没有扩展名) 并且所有脚本的参数都相同

@Echo off
For /F "tokens=*" %%S in ('Dir /B "%SCRIPTFOLDER%*.sql" '
) do echo sqlcmd -S %INSTANCE% -d %DATABASE% -U %USERNAME% -P "%PASSWORD%" -i "%%~fS" -s "|" -o "%%~dpnS.csv" -W

sqlcmd前面的回声可以防止执行并允许查看输出。如果一切正常,请删除回声。

可以使用~修饰符更改for变量行为,请参阅For /?或访问ss64.com/nt/for.html / syntax-args

要将文件夹传递给批处理,您可以通过set /P输入或通过命令行参数移交。

以上是关于在批处理脚本中使用sqlcmd来运行带有输出文件的多个脚本的主要内容,如果未能解决你的问题,请参考以下文章

SqlServer2008R2使用SQLCMD执行多个脚本

通过批处理文件在mssql本地服务器组中运行脚本

命令提示符中运行SQL Server 2005

如何使用sqlcmd在批处理脚本中执行SQL?

SQLCMD命令,如何将输出保存到日志文件中

插入查询在 SSMS 中有效,但在 SQLCMD 中无效