SSIS For Loop Container работает успешно, но задачи и сценарии потока данных внутри цикла периодически запускаются - PullRequest
3 голосов
/ 14 марта 2019

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

У меня есть цикл SSIS For, который всегда успешно завершается, но различные потоки данных и задачи сценариев внутри цикла периодически запускаются (иногда они все выполняются успешно, нокогда они не запускаются, у них не остается никакого индикатора, который они запускали ... никаких зеленых / красных / желтых галочек, просто пусто).Похоже, что evalexpression в цикле интерпретируется неправильно.Если я перезапущу пакет вручную в VS, иногда он возвращает данные, а иногда нет.Этот пакет развертывается на SSISDB, и задание агента SQL Server успешно выполняется каждую ночь, но, опять же, периодически возвращает или не возвращает данные предыдущих дней.

Цикл настроен на основе дат.Initexp назначает ему вчерашнюю дату, выражение присваивания увеличивает дату на день после ее успешного выполнения, а затем должно принимать значение false.См. Изображение

forlooplogic

Выражение переменной @begindate:

= dateadd("d",-1,getdate())

Вот изображение цикла For и элементоввнутри него.В случае, если это имеет значение, задачи внутри просто выходят и бьют API, сохраняют результат в переменной, а затем обрабатывают его с помощью различных задач скрипта.

forloopcontents

Какие-нибудь рекомендуемые дальнейшие шаги для устранения проблем?Что-то, что я пропускаю / отсутствует?

Изображение успешного запуска без данных с переменной информацией

successnodata

1 Ответ

1 голос
/ 14 марта 2019

Используйте @ [System :: StartTime] вместо GETDATE ()

Поскольку GETDATE() - это функция, которая оценивается каждый раз, когда ее вызывают, она может вызвать некоторые проблемы, если вы используете ее внутри длявыражение цикла.

Использование dateadd("d",-1,GETDATE()) в выражении Eval означает, что оно является динамическим и не содержит фиксированного значения .

Вы можете воспользоваться системная переменная @[System::StartTime], которая содержит дату и время выполнения пакета.Выражение, используемое для оценки @[User::begindate], будет:

= dateadd("d",-1, @[System::StartTime])

InitExpression

@startdate = @begindate

EvalExpression

@startdate <= dateadd("d",-1,@[System::StartTime])

Обратите внимание, что если @[System::StartTime] и @StartTime не сработали в выражении, добавьте новую переменную типа DateTime, а Evaluate будет выражением = @[System::StartTime], затем используйте эту переменную в выражении EvalExpression.

AssignExpression

@startdate = dateadd("d",1,@startdate)
...