0

У меня есть .bat-файл, который отображает отчеты SSRS в формате PDF. Отчет принимает 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" Command для каждого результатов хранимой процедуры

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 /?

Смотрите также статью Microsoft о Using command redirection operators для объяснения > и 2>nul.

Перенаправление оператора > в пределах 2>nul в пределах команды ДЛЯ во второй код партии должны быть экранированы с ^ для нанесения на выполнение sqlcmd.exe и не интерпретируется как оператор перенаправления для команды ДЛЯ при недопустимом положении в командной строке что приводит к синтаксической ошибке при выполнении командного файла без ^.

+0

Genius !!!! Спасибо :) – sqlsleepless

Смежные вопросы