表达式变量在运行时变化

时间:2019-02-24 06:23:30

标签: sql-server variables ssis expression etl

我有一个包含以下表达式的变量:

@[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 :(得分:1)

如果变量是表达式,则每次使用该变量时都会对其求值,因此GETDATE()函数每次调用该变量时都会返回一个不同的值,而不是使用Expression Task来求值一次仅执行。

因此,不要在变量属性中将变量评估为表达式,而是在数据流任务之前添加一个表达式任务,并使用以下表达式:

@[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"

答案 1 :(得分:1)

每次访问

GETDATE()都会被评估。由于该软件包无法在第二个名称中完成,因此您会感到整个软件包的漂移。

要固定整个包运行时的值,请使用系统范围的变量@ [System :: StartTime]

另请参见