我有一个SSIS 2019包,一旦文件被放置到一个文件夹中,它就会导入一个Excel,然后将Excel文件移动到另一个文件夹(代理将每30分钟运行一次)。在开始时,我有一个脚本任务,测试文件是否在预期的文件夹中,如果为真,那么控制流将转到数据流任务,如果不是,那么它将无处可去(进程结束在那里)。在测试包时,只要文件在我打开或对包做任何事情时位于预期的文件夹中,它就可以正常工作。在测试中,当我第二次运行包时,在文件被移动后,然后控制流没有经过脚本任务,但我从数据流中得到一个错误,因为在文件夹中自动创建了一个具有预期文件名的新空文件,但错误的工作表。我不知道是什么任务导致了这一点,或者如果excel文件连接管理器在包执行的那一刻做到了这一点。如果文件不在文件夹中,它甚至会在我打开包时立即执行此操作。我该如何阻止这一切?我不想让它创建一个空的excel文件。如果文件不在指定的文件夹中,我希望它什么也不做。
下面是一个完整的事件序列:
- 脚本任务检查文件是否在文件夹中—否:不执行任何操作
- Yes -执行SQL任务删除目标表1 中的记录
- 然后进入数据流a.Excel数据源进入数据转换任务b.然后数据进入OLE DB源(目标表1)
- 存在数据流-错误发送电子邮件
- 然后执行错误发送邮件的SQL任务a.删除Target Table 2中的记录b.在目标表2中插入没有空部件号的记录c.在日志历史表 中插入一条记录
- 然后执行文件系统任务,将Excel文件从IMBOX文件夹移动到OUTBOX文件夹—"错误"发送电子邮件-成功时发送电子邮件
有效的解决方案是将脚本任务(如果文件在文件夹查询中)移动到单独的解决方案中,并添加一个执行包任务,将其设置为文件系统的外部引用,即原始包。dtsx文件。它可以在Visual Studio和管理工作室中的Agent中完美运行。代理将被安排每5分钟运行一次,并且大多数时候没有要导入的Excel文件,也不会生成错误。然后用户将文件放入文件夹,然后在5分钟内它将被处理到ETL数据库,Excel文件将被移动到发件箱文件夹,用户将收到一封电子邮件,表明过程完成或失败。
我确信必须有另一种解决方案来防止数据流任务在打开包时不存在时创建Excel数据源。但上面的解决方案确实有效。