我需要在批处理文件中使用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脚本循环的示例,但我所看到的并没有使用输出文件集。
Per @ 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
我在批处理文件中运行它,当它暂停时,最后一行说,&#34;系统找不到指定的文件。&#34;
认为这可能是我路径中的反斜杠,我删除了它们并在.sql
行的for
之前放了一个斜线,但我得到了相同的结果。
完全删除反斜杠会导致&#34;找不到文件&#34;当我像那样跑的那条消息时。
答案 0 :(得分:2)
如果输出文件名与脚本名称匹配(不带扩展名)
并且所有脚本的参数都相同
@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输入或通过命令行参数进行切换。