SSIS脚本任务日期校验失败后需正常终止包执行的需求
修改SSIS脚本任务逻辑以实现预期行为
你需要调整脚本的返回值逻辑,并配合SSIS的控制流配置,让包在文件日期不晚于数据库最大日期时停止执行且返回成功状态,具体方案如下:
方案一:脚本标记状态 + 优先约束控制执行
- 修改VB脚本:新增布尔变量标记是否需要继续执行后续任务,无论日期对比结果如何,脚本都返回成功
Public Sub Main() Dim maxEvaluationDate As DateTime = CType(Dts.Variables("User::actual_excel_data_DB_table_MaxEvaluationDate").Value, DateTime) Dim fileDate As DateTime = File.GetLastWriteTime("\\servername1\folder1\folder2\Import\actual_excel_data_file.xlsx") Dts.Variables("User::actual_excel_data_file_FileDate").Value = fileDate ' 新增布尔变量,标记是否继续执行后续任务 Dts.Variables("User::ShouldContinueExecution").Value = (fileDate > maxEvaluationDate) ' 无论对比结果如何,脚本都返回成功 Dts.TaskResult = ScriptResults.Success End Sub
- 配置控制流优先约束:在脚本任务之后的所有任务上,设置优先约束为「表达式和约束」:
- 约束选项选择「成功」
- 表达式设置为
@[User::ShouldContinueExecution] == True
这样当文件日期不晚于数据库日期时,后续任务不会触发,包会直接以成功状态结束。
方案二:简化脚本逻辑(无需额外变量)
如果不需要标记状态,只想直接控制包停止执行并返回成功,可直接修改脚本的返回逻辑:
Public Sub Main() Dim maxEvaluationDate As DateTime = CType(Dts.Variables("User::actual_excel_data_DB_table_MaxEvaluationDate").Value, DateTime) Dim fileDate As DateTime = File.GetLastWriteTime("\\servername1\folder1\folder2\Import\actual_excel_data_file.xlsx") Dts.Variables("User::actual_excel_data_file_FileDate").Value = fileDate ' 无论日期对比结果,都返回成功 Dts.TaskResult = ScriptResults.Success ' 如果文件日期不晚于数据库日期,直接触发包停止执行 If Not (fileDate > maxEvaluationDate) Then Dts.Events.FireInformation(0, "Script Task", "文件日期未更新,包停止执行", String.Empty, 0, False) ' 通过设置包的终止状态,让包直接结束 Dts.Variables("System::CancelEvent").Value = True End If End Sub
注:使用System::CancelEvent变量需要确保在脚本任务的「变量」面板中勾选该系统变量的读权限。
内容的提问来源于stack exchange,提问作者Jeremy F.
相关产品推荐
相关产品推荐

