我有一个.bat文件,它以PDF格式呈现SSRS报告。该报告接受2个参数studentID和SubjectID。当我尝试传入每个studentID和SubjectID时,这很好。
我希望.bat文件执行一个存储过程,该过程包含studentID和SubjectID列表,并为每个StudentID和SubjectID运行/循环。 下面是.bat文件代码。
@setlocal enableextensions enabledelayedexpansion
@echo off
Set varServerPath=http://xyz/ReportServer
sqlcmd -Q "exec dbo.Storedproc_Studentlist" -S ServerName -d DatabaseName
LOOP:
rs -i C:\ReportRender\Student.rss -s%varServerPath% -e Exec2005 -v studentid="36" -v subjectid="500" -v vOutputFilePath="C:\ReportRender\Output\ZYZReport.pdf" -v vReportPath="/Student Reports/ReportName.rdl" -l 900
pause
exit
如何为存储过程的每个结果循环“rs”命令
dbo.Storedproc_Studentlist
此存储过程返回
SELECT '1' AS RowNumber,'1789' StudentID, '364' SubjectID, 'C:\Reports\tmurray' OutputLocation
UNION ALL
SELECT '2' AS RowNumber,'1789' StudentID, '365' SubjectID, 'C:\Reports\tmurray' OutputLocation
UNION ALL
SELECT '3' AS RowNumber,'1780' StudentID, '364' SubjectID, 'C:\Reports\mdbrisbin' OutputLocation
谢谢,
答案 0 :(得分:0)
命令 FOR 可用于在批处理文件中循环运行命令。
以下是一种可能的解决方案:
@echo off
setlocal EnableExtensions
set "ListFile=%TEMP%\StudentList.tmp"
set "varServerPath=http://xyz/ReportServer"
if exist "%ListFile%" del "%ListFile%"
sqlcmd.exe -Q "exec dbo.Storedproc_Studentlist" -S ServerName -d DatabaseName >"%ListFile%" 2>nul
if exist "%ListFile%" (
for /F "usebackq tokens=5,7 delims=', " %%A in ("%ListFile%") do (
echo Processing student with id %%A and subject with id %%B ...
rs.exe -i C:\ReportRender\Student.rss -s%varServerPath% -e Exec2005 -v studentid="%%A" -v subjectid="%%B" -v vOutputFilePath="C:\ReportRender\Output\ZYZReport.pdf" -v vReportPath="/Student Reports/ReportName.rdl" -l 900
)
del "%ListFile%"
)
endlocal
pause
如果不使用临时列表文件,也可以直接处理sqlcmd.exe
的输出。
@echo off
setlocal EnableExtensions
set "varServerPath=http://xyz/ReportServer"
for /F "tokens=5,7 delims=', " %%A in ('sqlcmd.exe -Q "exec dbo.Storedproc_Studentlist" -S ServerName -d DatabaseName 2^>nul') do (
echo Processing student with id %%A and subject with id %%B ...
rs.exe -i C:\ReportRender\Student.rss -s%varServerPath% -e Exec2005 -v studentid="%%A" -v subjectid="%%B" -v vOutputFilePath="C:\ReportRender\Output\ZYZReport.pdf" -v vReportPath="/Student Reports/ReportName.rdl" -l 900
)
endlocal
pause
要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。
echo /?
if /?
del /?
set /?
setlocal /?
endlocal /?
for /?
pause /?
exit /?
有关>
和2>nul
的说明,另请参阅有关Using command redirection operators的Microsoft文章。
第二批代码中命令 FOR 内的>
内的重定向操作符2>nul
必须使用^
进行转义,以便在执行{{1}时应用并且没有被解释为命令行中无效位置的命令 FOR 的重定向运算符,导致执行没有sqlcmd.exe
的批处理文件时出现语法错误。