【问题标题】:SSIS Foreach Loop process only files that weren't processed yetSSIS Foreach 循环仅处理尚未处理的文件
【发布时间】:2015-07-17 17:12:17
【问题描述】:

我正在开发一个 SSIS 2012 DTS,它必须 ETL 数据从 csv 到 DB。

每天都会提供 csv 文件,其发布日期将在文件名中显示:filename_YYMMDD.csv

当然,它不能多次处理同一个文件,这样数据就不会在 DB 上重复。问题是我在处理文件时无法删除或重命名文件。我必须处理我还没有处理过的文件,不要管旧的。

我正在考虑在处理文件时使用日志表来存储文件的日期。在 FLC 开始时,我向 DB 查询当前文件的日期。如果在日志表中找不到日期,FLC 将运行 ETL。如果找到日期,FLC 会跳到下一个文件。

有可能吗?我应该用脚本任务来做吗?如何将 continue 命令从脚本任务发送到 FLC 循环?或者我可以通过执行 SQL 任务以某种方式做到这一点吗?

【问题讨论】:

  • 当然你可以通过执行 SQL 任务来完成。无需发送 continue 命令,ForEach 循环将在其中的所有任务完成后转到下一个文件。
  • 我的意思是,在 EST 之后,如果确定文件已经被处理,FLC 必须停止当前迭代并开始下一个迭代,而不是执行它直到结束。我所说的 continue 命令相当于 C 循环中的 continue
  • 在您的问题中,您声明:` 在 FLC 的开头,我向 DB 查询当前文件的日期。如果在日志表上找不到日期,FLC 将运行 ETL。` 所以我再说一遍,你不需要继续。一个文件处理完后,会自动转到下一个。它将再次检查该文件是否已被处理,如果是,则跳过它并转到下一个,并继续这样做,直到没有更多文件要处理。
  • 是的,就是这样。正确的英文单词应该跳过而不是继续。我只是在思考循环如何在 C 关键字 C 中工作。

标签: sql-server csv ssis etl dts


【解决方案1】:

我正是使用日志表来记录我成功处理的所有文件。确保您在处理 csv 文件后更新日志表的事务中执行此操作。您可能会发现在日志表中包含处理的行数以及处理文件所用的时间很方便。

【讨论】:

  • 好主意!但是怎么做呢?我正在使用数据流任务,从平面文件源开始并使用 OLE DB 目标插入数据库。我怎样才能知道它插入的记录数量和用了多长时间?
  • 您可以使用行数转换来获取刚刚处理的行数。我所做的是在行中读入一个表,然后将文件名传递给一个 proc(SQL 任务),它将通过检查日志表来决定该表是否已被处理(在这种情况下它什么也不做)或尚未处理(在这种情况下,它处理了行。4)在 SQL Server procs 中,您可以使用 @@rowcount 并在处理前后选择 getdate() 以查看某事花费了多长时间。
  • “行计数转换”是 SSIS 组件吗?我在 SSDT 2012 中找不到它。
  • 嗨,它在我所知道的每个版本的 SSIS 中:msdn.microsoft.com/en-us/library/ms141136.aspx
猜你喜欢
  • 1970-01-01
  • 2023-03-06
  • 2018-04-17
  • 1970-01-01
  • 2020-05-27
  • 1970-01-01
  • 1970-01-01
  • 2022-10-21
  • 2011-10-19
相关资源
最近更新 更多