在批处理脚本中使用 sqlcmd 运行 多个脚本和输出文件
Using sqlcmd in a batch script to run multiple scripts with output files
我需要使用批处理文件中的 sqlcmd 运行 文件夹中的大约 50 个脚本。每个脚本的查询结果都需要发送到它自己的输出文件中。我有一个工作批处理文件,每个文件仅来自单独的行 运行s:
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
我 运行 在批处理文件中,当它暂停时,最后一行说,"The system cannot find the file specified."
我认为这可能是我路径中的反斜杠,我删除了它们并在 for
行中的 .sql
前加了一个斜杠,但我得到了相同的结果。
当我 运行 那样时,完全删除反斜杠会导致 "File not found" 消息。
如果您的输出文件名与脚本名称匹配(不带扩展名)
并且所有脚本的参数都相同
@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
前面的 echo 阻止执行并允许查看输出。如果一切正常,请删除 echo。
可以使用 ~
修饰符更改 for 变量的行为,请参阅 For /?
或访问 ss64.com/nt/for.html / syntax-args
要将文件夹传递给批次,您可以通过 set /P 输入或通过命令行参数移交。
我需要使用批处理文件中的 sqlcmd 运行 文件夹中的大约 50 个脚本。每个脚本的查询结果都需要发送到它自己的输出文件中。我有一个工作批处理文件,每个文件仅来自单独的行 运行s:
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
我 运行 在批处理文件中,当它暂停时,最后一行说,"The system cannot find the file specified."
我认为这可能是我路径中的反斜杠,我删除了它们并在 for
行中的 .sql
前加了一个斜杠,但我得到了相同的结果。
当我 运行 那样时,完全删除反斜杠会导致 "File not found" 消息。
如果您的输出文件名与脚本名称匹配(不带扩展名)
并且所有脚本的参数都相同
@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
前面的 echo 阻止执行并允许查看输出。如果一切正常,请删除 echo。
可以使用 ~
修饰符更改 for 变量的行为,请参阅 For /?
或访问 ss64.com/nt/for.html / syntax-args
要将文件夹传递给批次,您可以通过 set /P 输入或通过命令行参数移交。