【问题标题】:Loop through table while records keep getting added to the table循环遍历表,同时记录不断添加到表中
【发布时间】:2021-11-04 09:35:48
【问题描述】:

我有一个包含文件名列表的表 (FilesToCopy)。

id filename
1 c:\temp\file1.txt
2 c:\temp\file2.txt
3 c:\temp\file2.txt

文件被一个一个地复制到另一个位置(例如c:\test)。 我可以很容易地遍历这个表来为每个文件执行一个复制命令。 这只是一个读取表的执行 SQL 任务,将结果放入一个对象变量中,然后是一个 For Each 容器。

但是,如果在 for each 循环的执行过程中,记录被添加到表 FilesToCopy 中呢?

想象一下在 for each 循环中文件 c:\temp\file99.txt 被添加到表 FilesToCopy

id filename
1 c:\temp\file1.txt
2 c:\temp\file2.txt
3 c:\temp\file2.txt
99 c:\temp\file99.txt

我能否以某种方式告诉 for each 循环它还必须复制文件 c:\temp\file99.txt,即使该文件在循环开始时不存在?

所以效果会是:

  1. 读取表FilesToCopy,开始循环。
  2. c:\temp\file1.txt 被复制到 c:\test
  3. c:\temp\file1.txt 的记录已从表 FilesToCopy 中删除
  4. c:\temp\file2.txt 复制到 c:\test
  5. c:\temp\file2.txt 的记录已从表 FilesToCopy 中删除
  6. 同时c:\temp\file99.txt被添加到表FilesToCopy
  7. c:\temp\file3.txt 复制到 c:\test
  8. c:\temp\file3.txt 的记录已从表 FilesToCopy 中删除
  9. c:\temp\file99.txt 被复制到 c:\test
  10. c:\temp\file99.txt 的记录已从表 FilesToCopy 中删除
  11. 当表FilesToCopy中没有更多记录时循环结束

所以我想做的就是以某种方式刷新循环启动时馈入的列表。

我希望这很清楚。

【问题讨论】:

  • 看起来foreach 容器就是你想要的。如果您请求数据(可能是使用 Transact-SQL 任务),那么该数据就在对象中,并且您正在使用该数据。也许您应该逐行获取,并在完成任务后将它们标记为“已完成”。然后,如果添加或删除行,您将相应地处理它们。
  • 但是对象一旦被对象任务填充就不会改变,是吗?所以即使表有新记录,对象也不知道吗?还是我在这里想错了?
  • 这就是为什么我说一行一行,而不是所有行。
  • 啊!我想我明白你的意思了,谢谢你让我(再次)走上正确的道路,向你学习了很多东西。
  • 我刚刚注意到我打错了不是,抱歉。那应该是 “看起来像 Foreach 循环容器 不是 你想要的。” 相反,你只想要一个 For 循环容器。

标签: tsql ssis file-copying sql-server-2019 ssis-2019


【解决方案1】:

我会改用 do while 循环。

有一个名为 moreToProcess 的变量,数据类型为布尔值。

使用execute SQL statement based on count > 0设置进入循环前的值

循环的第一步是使用 exec SQL 获取要处理的记录。

在退出循环之前重新运行 SQL 以重置变量。

当 moreToProcess 为真时设置为循环。

【讨论】:

  • 另外,我会推荐表数据类型位默认为 0 的 isProcessed 列。我不会删除,而是将此列标记为 1(真)。这可以让你看到你为什么做某事。加载时将 LoadTimeStamp 默认为 getdate() 也很好。
  • 在谈论 Do While 时猜测您的意思是 For 循环,这让我走上了正确的轨道
  • 我猜你是对的。它在 SSIS 中在技术上称为 for 循环,但在大多数语言中,FOR 循环是要运行的已知循环数(例如 FOR i = 1 到 10),而 WHILE 循环用于未知数量的循环而条件成立。 SSIS 将这两种结构包装到一个对象中。
猜你喜欢
  • 1970-01-01
  • 2016-04-27
  • 1970-01-01
  • 1970-01-01
  • 2021-03-09
  • 2016-08-06
  • 1970-01-01
  • 2013-02-04
  • 1970-01-01
相关资源
最近更新 更多