0

Ich habe eine .bat-Datei, die SSRS-Berichte im PDF-Format rendert. Der Bericht akzeptiert 2 Parameter studentID und SubjectID. Dies läuft gut, wenn ich versuche, jede studentID und SubjectID zu übergeben.Loop in einer .bat-Datei mit verschiedenen Parametern

Ich möchte, dass die .bat-Datei eine gespeicherte Prozedur ausführen, die eine Liste von StudentID und SubjectID hat und für jede StudentID und SubjectID ausführen/durchlaufen. Unten ist der .bat-Dateicode.

@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 

Wie kann ich eine Schleife durch die "rs" Befehl für jede Ergebnisse der gespeicherten Prozedur

dbo.Storedproc_Studentlist 

Diese gespeicherte Prozedur gibt

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 

Danke,

+0

Die Verwendung einer .bat-Datei ist in der Regel nicht einfach zu verwalten. Ein alternativer Ansatz wäre die Verwendung einer datengesteuerten Subskription.Die gespeicherte Prozedur kann die Parameterwerte bereitstellen, und der Bericht kann per E-Mail gesendet oder in einem freigegebenen Ordner gespeichert werden. – StevenWhite

+0

Mit Standard-Edition, kann nicht datengesteuertes Abonnement verwenden :( – sqlsleepless

Antwort

0

Der Befehl FOR kann verwendet werden, um einen Befehl in einer Schleife auszuführen f rom in einer Batch-Datei.

Hier ist eine mögliche Lösung:

@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 

Es könnte auch ohne Verwendung einer temporären Liste Datei die Ausgabe von sqlcmd.exe direkt zu verarbeiten arbeiten.

@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 

für die verwendeten Befehle verstehen und wie sie arbeiten, öffnen Sie eine Eingabeaufforderung, führen Sie dort die folgenden Befehle ein und vollständig alle Hilfeseiten für jeden Befehl angezeigt sehr sorgfältig lesen.

  • echo /?
  • if /?
  • del /?
  • set /?
  • setlocal /?
  • endlocal /?
  • for /?
  • pause /?
  • exit /?

Siehe auch den Microsoft Artikel über Using command redirection operators für eine Erklärung der > und 2>nul.

Der Umleitungsoperator > innerhalb 2>nul innerhalb Befehls FOR im zweiten Charge Code muss mit ^ angewandt wird bei der Ausführung von sqlcmd.exe und nicht interpretiert als Umleitungsoperator für den Befehl FOR bei einer ungültigen Position in der Befehlszeile maskiert werden Dies führt zu einem Syntaxfehler bei der Ausführung der Batchdatei ohne ^.

+0

Genius !!!! Danke :) – sqlsleepless