循环遍历表,同时记录不断添加到表中

Posted

技术标签:

【中文标题】循环遍历表,同时记录不断添加到表中【英文标题】: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,即使该文件在循环开始时不存在?

所以效果会是:

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

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

我希望这很清楚。

【问题讨论】:

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

以上是关于循环遍历表,同时记录不断添加到表中的主要内容,如果未能解决你的问题,请参考以下文章

使用哈巴狗每次循环遍历一组对象

AJAX如何动态地将行添加到表中

如何使用 React JS 循环遍历 MongoDB 数组以呈现表?

Oracle过程 - 选择所有表,然后循环遍历这些表的记录

循环遍历多个表的 plsql 代码

记录集到表?