Как настроить контейнер цикла foreach в службах SSIS так, чтобы он принимал определенные даты начала и окончания и выполнялся для каждой промежуточной даты? - PullRequest
3 голосов
/ 16 апреля 2019

Я хотел бы определить параметры start_date и end_date в моем пакете служб SSIS и иметь контейнер foreach, который выполняется для каждой даты между этими 2 (включительно), который выполняет запрос SQL, принимая втекущее значение даты (т.е. начиная с start_date) и использование его в качестве параметра для запроса.

Я довольно новичок в программировании служб SSIS и не могу найти информацию о том, как это сделать.

Ответы [ 3 ]

1 голос
/ 16 апреля 2019

Я использовал задачу «Выполнение SQL» для сохранения дат (результатов) в виде набора результатов в пользовательской переменной.Затем внутри контейнера цикла foreach я использовал перечислитель ADO foreach для пользовательской переменной, которая имеет набор дат.Используя отображение переменных в контейнере цикла foreach, вы можете отобразить start_date и end_dates из определенной пользователем переменной и передать ее другим переменным.

Например: у меня есть оператор SELECT, который выбирает 2 строки со столбцами start_dateи end_date.Это будет сохранено как результирующий набор в переменной с именем "main_dates".Перечислитель ADO foreach будет перечислять эту переменную main_dates (для каждой строки в main_dates запускается цикл for).Затем в разделе «Сопоставление переменных» вы можете создать 2 новые переменные с именами u_start_date и u_end_date и сопоставить столбцы 0 и 1. с этими переменными.

Внутри цикла foreach всякий раз, когда вы выполняете хранимую процедуру, вы можете передать u_start_dateи переменные u_end_date в качестве параметров.

1 голос
/ 16 апреля 2019

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;
}

enter image description here

1 голос
/ 16 апреля 2019

Вы можете просто добавить контейнер цикла for и использовать эти переменные, как указано на рисунке ниже:

enter image description here

Где @[User:Loop], @[User:MinDate], @[User::MaxDate] имеют тип System.DateTime

ссылка на изображение

Передача параметров для выполнения задачи SQL

Вы можете обратиться к следующим сообщениям для получения более подробной информации:

...