Переменная выражения изменяется во время выполнения - PullRequest
0 голосов
/ 24 февраля 2019

У меня есть переменная, которая содержит следующее выражение:

@[User::DestinationDirectory] 
+ "\\files\\Charges_"
+ RIGHT("0" + (DT_STR, 2, 1252) DATEPART("dd" , GETDATE()), 2)
+ "_"
+ RIGHT("0" + (DT_STR, 2, 1252) DATEPART("mm" , GETDATE()), 2)
+ "_"
+ (DT_STR, 4, 1252) DATEPART("yyyy" , GETDATE())


+ "_"
+ RIGHT("0" + (DT_STR, 2, 1252)DATEPART("hh", GETDATE()), 2) 
+ "_"
+ RIGHT("0" + (DT_STR, 2, 1252)DATEPART("mi", GETDATE()), 2) 
+ "_"
+ RIGHT("0" + (DT_STR, 2, 1252)DATEPART("ss", GETDATE()), 2)
+ ".csv"

Эта переменная используется в качестве имени файла для сгенерированного CSV в потоке данных:

enter image description here

После этого у меня есть следующее в обработчиках событий / после выполнения:

enter image description here

Это проверяет, еслифайл имеет 0 строк, а затем удаляет файл, если он есть.

enter image description here

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

Как заставить переменную сохранять свое значение в начале пакета, и оно не изменяется?

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

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

Чтобы зафиксировать значение для всего времени выполнения пакета, используйте системную переменную области действия @ [System :: StartTime]

См. Также

0 голосов
/ 24 февраля 2019

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

Таким образом, вместо оценки переменных в качестве выражения в свойствах переменной, добавьте задачу выражения перед задачей потока данных и используйте следующее выражение:

@[User::FilePath]  = @[User::DestinationDirectory]
+ "\\files\\Charges_"
+ RIGHT("0" + (DT_STR, 2, 1252) DATEPART("dd" , GETDATE()), 2)
+ "_"
+ RIGHT("0" + (DT_STR, 2, 1252) DATEPART("mm" , GETDATE()), 2)
+ "_"
+ (DT_STR, 4, 1252) DATEPART("yyyy" , GETDATE())
+ "_"
+ RIGHT("0" + (DT_STR, 2, 1252)DATEPART("hh", GETDATE()), 2) 
+ "_"
+ RIGHT("0" + (DT_STR, 2, 1252)DATEPART("mi", GETDATE()), 2) 
+ "_"
+ RIGHT("0" + (DT_STR, 2, 1252)DATEPART("ss", GETDATE()), 2)
+ ".csv"

Обновление 1

На основании комментариев, если у вас есть 16 переменных.В этом случае вам следует добавить переменную типа Date, присвоить ее значение с помощью Expression Task и использовать эту переменную вместо GETDATE() в выражении переменных.пример:

Задание выражения

@[User::FileDate] = GETDATE()

Переменное выражение

@[User::FilePath]  = @[User::DestinationDirectory]
+ "\\files\\Charges_"
+ RIGHT("0" + (DT_STR, 2, 1252) DATEPART("dd" , @[User::FileDate]), 2)
+ "_"
+ RIGHT("0" + (DT_STR, 2, 1252) DATEPART("mm" , @[User::FileDate]), 2)
+ "_"
+ (DT_STR, 4, 1252) DATEPART("yyyy" , @[User::FileDate])
+ "_"
+ RIGHT("0" + (DT_STR, 2, 1252)DATEPART("hh", @[User::FileDate]), 2) 
+ "_"
+ RIGHT("0" + (DT_STR, 2, 1252)DATEPART("mi", @[User::FileDate]), 2) 
+ "_"
+ RIGHT("0" + (DT_STR, 2, 1252)DATEPART("ss", @[User::FileDate]), 2)
+ ".csv"
...