A For Loop
будет лучшим вариантом для этого. Предполагая, что даты начала и окончания, указанные в качестве параметров пакета, указаны в вашем вопросе, имейте в виду, что параметры не могут быть обновлены в пакете служб SSIS , какими бы ни были переменные. Это, а также пример процесса, описанного в вашем вопросе, подробно описан ниже.
- Создать переменную даты и времени служб SSIS. Как упоминалось ранее, это будет использоваться для хранения начального значения параметра даты начала.
- Затем добавьте цикл For в поток управления. На снимке экрана ниже переменная
@[User::vStartDate]
имеет то же значение, что и параметр пакета @[$Package::pStartDate]
в InitExpression
в цикле For. Итерации цикла продолжаются, пока переменная начальной даты меньше или равна параметру конечной даты, указанному в поле EvalExpression
.
- После выполнения задачи «Выполнение SQL» (или выполнения запроса SQL) добавьте задачу «Сценарий». Это увеличит значение переменной даты начала, поэтому убедитесь, что это последняя задача в цикле. Ниже приведен пример сценария C #, который просто устанавливает значение переменной SSIS начальной даты в переменную C #, увеличивает переменную C # на один день, а затем записывает это значение обратно в переменную SSIS. Обязательно добавьте переменную даты начала служб SSIS в поле
ReadWriteVariables
в задаче сценария. Это будет происходить в методе сценария Main
следующим образом. Несмотря на то, что в задаче «Сценарий» выполняется только увеличение даты и обновление переменной, наличие этого на месте позволит упростить устойчивость в долгосрочной перспективе в случае, если к этому потребуется добавить больше логики, поскольку C # предоставляет гораздо больше функций.
Задача сценария:
public void Main()
{
//get value in current iteration of loop
DateTime currentIterationValue = Convert.ToDateTime(Dts.Variables["User::vStartDate"].Value);
//increment by one day
currentIterationValue = currentIterationValue.AddDays(1);
//update SSIS variable
Dts.Variables["User::vStartDate"].Value = currentIterationValue;
Dts.TaskResult = (int)ScriptResults.Success;
}