#sql-server #ssis #etl #foreach-loop-container
#sql-server #ssis #etl #foreach-loop-container
Вопрос:
Я провел некоторое исследование по SO, но мне трудно найти решение (возможно, я ищу именно так), поэтому, пожалуйста, направьте меня к соответствующему сообщению, если вы знаете о нем. Я также ни в коем случае не являюсь гуру SSIS.
У меня есть SSIS для цикла, который всегда завершается успешно, но различные задачи потока данных и скрипта внутри цикла выполняются с перерывами (все они иногда выполняются успешно, но когда они не выполняются, у них не остается индикатора того, что они ran…no зеленые / красные / желтые флажки, просто пустые). Похоже, что evalexpression в цикле интерпретируется неправильно. Если я повторно запускаю пакет вручную в VS, иногда он возвращает данные, а иногда нет. Этот пакет развертывается в SSISDB, и задание агента SQL Server выполняется успешно каждую ночь, но опять же, периодически возвращает или не возвращает данные за предыдущие дни.
Цикл настраивается на основе дат. Initexp присваивает ему вчерашнюю дату, выражение assign увеличивает переменную date на день после успешного выполнения, а затем должно принять значение false. Смотрите изображение
Выражение @begindate
переменной равно
= dateadd("d",-1,getdate())
Вот изображение цикла For и элементов внутри него. В случае, если это имеет значение, задачи внутри просто выходят и обращаются к api, сохраняя результат в переменной, а затем обрабатывают его с помощью различных задач скрипта.
Какие-либо рекомендуемые следующие шаги для устранения неполадок? Что-нибудь, что я упускаю из виду / пропускаю?
Изображение успешного запуска без данных с переменной информацией
Комментарии:
1. Местоположение базы данных SSIS и системное время будут иметь значение. Это локальный сервер?
2. @user10454145 можете ли вы опубликовать изображение, когда оно не запускается? Все ли не удается запустить? Если вы добавите ведение журнала, что вы увидите в нем?
3. @ShivSidhu да, это локальный сервер, спасибо, что спросили, я забыл включить это в сообщение. Он правильно интерпретирует выражение dateadd (например, оно возвращает 13 марта, когда я запускаю его сегодня, 14 марта)
4. @Arthur опубликовал фотографию в OP. Я отключил другие пакеты, но все они делают нечто подобное. Вставлена ссылка на изображение, которое показывает, что контейнер цикла For успешно выполняется, а затем какие переменные заполняются во время выполнения. Не уверен, какие еще журналы вы хотели бы видеть?
5. Я вижу, что у вас установлена точка останова, поэтому выполнение останавливается @user10454145
Ответ №1:
Используйте @[System::startTime] вместо GETDATE()
Поскольку GETDATE()
это функция, которая вычисляется при каждом ее вызове, это может вызвать некоторые проблемы, если вы используете ее внутри выражения цикла for.
Использование 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
и вычислите is как выражение = @[System::StartTime]
, затем используйте эту переменную в evalExpression.
AssignExpression
@startdate = dateadd("d",1,@startdate)
Комментарии:
1. Я реализовал этот подход… Я сообщу о любом успехе. Если моя работа успешно вернет данные сегодня вечером и завтра, я вернусь и отмечу это как решение, спасибо!
2. Кажется, работает, никогда бы не подумал, что getdate() вызовет такие проблемы. Спасибо!