在具有不同参数的.bat文件中循环

时间:2016-07-15 19:54:46

标签: sql-server batch-file reporting-services ssrs-2008-r2 sqlcmd

我有一个.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

谢谢,

1 个答案:

答案 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的批处理文件时出现语法错误。