如何让For Each container处理运行时新增到FilesToCopy表的记录
SSIS动态感知新增待复制文件实现方案
你不需要修改原有For Each循环的输入列表,直接调整控制流结构即可实现需求,具体步骤如下:
- 首先新增3个包变量:
- Int32类型的
@RecordCount:用于存储FilesToCopy表当前待处理记录总数,初始值设为1 - String类型的
@CurrentFileName:用于存储当前待处理的文件全路径 - String类型的
@TargetPath:固定赋值为c:\test,可根据需求调整
- Int32类型的
- 配置外层For Loop容器,循环条件设置为
@RecordCount > 0,只要表内还有未处理记录就持续运行 - 在For Loop容器内部按顺序添加以下任务:
- 第一个Execute SQL Task:执行SQL语句
SELECT COUNT(1) FROM FilesToCopy,结果集设为单行,将查询结果赋值给变量@RecordCount。如果此时查询结果为0,循环会直接终止 - 第二个Execute SQL Task:执行SQL语句
SELECT TOP 1 filename FROM FilesToCopy ORDER BY id ASC,结果集设为单行,将查询到的文件名赋值给变量@CurrentFileName - File System Task:操作类型选「复制文件」,源路径变量选
@CurrentFileName,目标路径表达式设为@[User::TargetPath] + RIGHT(@[User::CurrentFileName], CHARINDEX("\\", REVERSE(@[User::CurrentFileName])) - 1),自动拼接目标目录下的完整文件路径 - 第三个Execute SQL Task:执行删除语句
DELETE FROM FilesToCopy WHERE filename = ?,参数映射选择变量@CurrentFileName对应问号占位符,处理完成后删除当前记录
- 第一个Execute SQL Task:执行SQL语句
- 可选优化:如果单条处理效率较低,可将第二条执行SQL任务改为批量查询最新N条记录存入对象变量,后续嵌套原有的For Each容器批量处理该批次记录,批次处理完成后回到外层循环重新刷新待处理列表即可,同样可以感知新增记录。
并发场景注意:如果存在多个包实例同时处理同一张表的情况,可在查询文件名的SQL中加锁提示
SELECT TOP 1 filename FROM FilesToCopy WITH (UPDLOCK, READPAST) ORDER BY id ASC,避免重复处理同一条记录或者死锁问题。
内容的提问来源于stack exchange,提问作者Henrov
相关产品推荐
相关产品推荐

