循环遍历表,同时记录不断添加到表中
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 将这两种结构包装到一个对象中。以上是关于循环遍历表,同时记录不断添加到表中的主要内容,如果未能解决你的问题,请参考以下文章