如何使用SSIS包仅循环通过目标中不存在的文件?

lar*_*o68 7 ssis file flat sql-server-2008

我在网络上有一个带文件的文件夹,我正在将文件从一个文件夹移动到另一个文件夹.但我只想移动新文件,因此只能复制目标文件夹中不存在的文件.怎么样?我已经有了for each循环容器和文件系统任务.我正在使用变量.现在,每次执行包时,它都会将所有文件从一个文件夹复制到下一个文件夹.我可以坚持使用某种条件工具吗?我不擅长编写脚本,所以如果这是唯一的解决方案,我可能需要你的帮助.

小智 11

这是一个可以使用Foreach循环容器,脚本任务文件系统任务实现此目的的选项.以下示例显示了如何完成此操作.该示例是使用SSIS 2008 R2创建的.

分步过程:

  1. 在路径中创建两个名为SourceDestination的文件夹C:\temp\,如屏幕截图#1所示.

  2. 将名为Sample_File_01.txt的示例文件放在文件夹路径中C:\temp\Source\,并将另一个文件夹C:\temp\Destination\留空.仅当文件已存在时,SSIS包才会将文件从Source文件夹复制到Destination文件夹.参考屏幕截图#2和#3.

  3. 在SSIS包上,创建7个变量,如屏幕截图#4所示.将变量DestinationFolder设置为值C:\temp\Destination\.将变量SourceFolder设置为该值C:\temp\Source\.将变量FilePattern设置为值*.*.您可以根据需要更改这些变量的值.

  4. 选择变量SourceFilePathProperties并按F4按钮打开窗口.将属性EvaluateAsExpression更改为True,并将属性Expression设置为值@[User::SourceFolder] + @[User::FileName].参见截图#5.

  5. 选择变量DestinationFilePathProperties并按F4按钮打开窗口.将属性EvaluateAsExpression更改为True,并将属性Expression设置为值@[User::DestinationFolder] + @[User::FileName].参见截屏#6.

  6. 在SSIS包的C ontrol Flow选项卡上,放置Foreach Loop container并配置容器的属性,如屏幕截图#7和#8所示.确保选择Name and extension" 收集"部分中的单选按钮.

  7. 在Foreach循环容器中,放置一个Script Task.双击脚本任务,然后单击Edit Script按钮.使用" 脚本任务代码"部分下给出的代码替换脚本任务中的Main()方法.此代码检查目标文件是否已存在,然后相应地填充布尔变量DoesFileExist.

  8. 在Foreach循环容器中,File System Task在"脚本任务"下面放置一个.将脚本任务的成功绿色箭头连接到文件系统任务.配置文件系统任务,如屏幕截图#9所示.

  9. 只有在目标路径中不存在该文件时,我们才需要执行文件系统任务.因此,我们需要更改脚本任务和文件系统任务之间的连接器.右键单击绿色连接器,然后选择编辑,如屏幕截图#10所示.

  10. 配置Precedence Constraint,如屏幕截图#11所示.这将检查变量DoesFileExist是否包含值False,这意味着在目标中找不到该文件.

  11. 配置完成后,SSIS包应该如屏幕截图#12所示.

  12. 屏幕截图#13显示了第一个包执行.在执行期间,目标路径中没有文件C:\temp\Destination\.执行后,文件Sample_File_01.txt已从中复制C:\temp\Source\C:\temp\Destination\.参见截图#14.

  13. 屏幕截图#15显示了第二个包执行.在执行期间,没有文件被复制到目标路径C:\temp\Destination\.您可以注意到,File System Task由于Precedence约束失败,因此未执行.

希望有所帮助.

脚本任务代码:

只能使用的C#代码SSIS 2008 and above.

public void Main()
{
    Variables varCollection = null;

    Dts.VariableDispenser.LockForRead("User::DestinationFilePath");
    Dts.VariableDispenser.LockForWrite("User::DoesFileExist");
    Dts.VariableDispenser.GetVariables(ref varCollection);

    varCollection["User::DoesFileExist"].Value = Convert.ToBoolean(System.IO.File.Exists(varCollection["User::DestinationFilePath"].Value.ToString()));

    Dts.TaskResult = (int)ScriptResults.Success;
}
Run Code Online (Sandbox Code Playgroud)

截图#1:

1

截图#2:

2

截图#3:

3

截图#4:

4

截图#5:

五

截图#6:

6

截图#7:

7

截图#8:

8

截图#9:

9

截图#10:

10

截图#11:

11

截图#12:

12

截图#13:

13

截图#14:

14

截图#15:

15