0

我有一個以PDF格式呈現SSRS報告的.bat文件。該報告接受2個參數studentID和SubjectID。當我嘗試傳入每個studentID和SubjectID時,它運行良好。使用不同參數的.bat文件中的循環

我想讓.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

使用.bat文件通常不容易維護。另一種方法是使用數據驅動訂閱。存儲過程可以提供參數值,報告可以通過電子郵件發送或存儲在共享文件夾中。 – StevenWhite

+0

使用標準版,不能使用數據驅動訂閱:( – sqlsleepless

回答

0

命令FOR可用於在循環中運行命令f ROM在批處理文件中。

這裏是一個可能的解決方案:

@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

2>nul重定向操作符>命令內FOR在第二批代碼必須與^轉義要對的sqlcmd.exe執行應用和在無效的位置,在命令行不被解釋爲重定向操作者命令FOR導致在沒有^的批處理文件執行時出現語法錯誤。

+0

天才!!!!謝謝:) – sqlsleepless

相關問題