【发布时间】: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 循环容器。
标签: tsql ssis file-copying sql-server-2019 ssis-2019