如何确保SSIS变量DTSTART仅被求值一次?
解决SSIS中DateTime变量多次求值的问题
SSIS里如果变量开启了EvaluateAsExpression且表达式是GETDATE(),每次引用这个变量时都会重新执行表达式,自然会拿到不同的时间戳。要让DTSTART只求值一次,核心是把它从动态表达式变量改成静态赋值变量,具体有两种常用方法:
方法1:用脚本任务提前赋值
- 先修改
DTSTART的属性:把EvaluateAsExpression设为False,清空原来的表达式内容。 - 在包的最开始(所有会引用
DTSTART的组件之前)添加一个脚本任务。 - 配置脚本任务的
ReadWriteVariables,把DTSTART加进去(确保有读写权限)。 - 打开脚本编辑器,用C#或VB.NET给变量赋值:
- C#示例:
public void Main() { Dts.Variables["DTSTART"].Value = DateTime.Now; Dts.TaskResult = (int)ScriptResults.Success; } - VB.NET示例:
Public Sub Main() Dts.Variables["DTSTART"].Value = DateTime.Now Dts.TaskResult = ScriptResults.Success End Sub
- C#示例:
- 运行包时,脚本任务会在最开始给
DTSTART赋值一次,后续所有引用这个变量的组件都会拿到同一个时间值。
方法2:利用包的OnPreExecute事件赋值
- 同样先把
DTSTART的EvaluateAsExpression设为False,清空表达式。 - 在包的属性窗口里找到
Events,双击OnPreExecute事件,添加脚本处理。 - 在事件脚本里写入赋值代码(和方法1的脚本逻辑一致),这样包启动时就会自动给
DTSTART赋值一次,后续所有引用都用这个固定值。
注意事项
- 确保赋值操作的执行顺序在所有引用
DTSTART的组件之前,否则会出现变量未赋值的错误。 - 如果
DTSTART是子包级别的变量,要确保赋值逻辑在子包启动时执行,或者通过父包传递已经赋值好的变量值。
内容的提问来源于stack exchange,提问作者variable
相关产品推荐
相关产品推荐

