文件处理后如何将文件移动到存档文件夹?

我试图将一组文件从源path存档到一个存档path,一旦我完成了一些数据stream任务项目。 Foreach循环容器的内部我有:脚本任务 – >数据stream任务 – >执行SQL任务 – >文件系统任务

我有一个用户variables设置为Foreach循环容器中集合设置下的“名称和扩展名”项。 该variables被称为“文件名”,并在脚本任务(用于从文件parsing出信息并执行执行SQL任务)以及在平面文件连接pipe理器中的数据stream任务中使用平面文件源元素。 然后parsing文件并将数据插入到数据库中。 所有的工作,因为它应该,直到我到文件系统任务(FST)。

我想要的是一旦它的插入完成后,该文件移动到一个存档文件夹。 使用几个在线链接( 这里 , 这里和这里 )我已经添加了不同的variables,要么硬编码或从其他variables派生。 在任何情况下,发生的事情是,在FST上我得到错误,如“path中的无效字符”或“未知path”。 如果我尝试按照上面链接的示例来适应我的文件系统结构,我现在在数据stream任务中的平面文件源步骤中出现错误,说明它无法find指定的文件。 这是因为它a)无法find文件的path,因为没有给出文件path,只是filname.ext b)无法parsing包含源文件的完整path的variables( @FullSourcePathFileName ,其值设置为@[User::SourcePath] + @[User::fileName]

我已经testing了其他各种修改,包括完成我发布的第一个示例中的内容(但是,实际上并没有执行任何数据stream任务,因此我只是添加了没有目标的平面文件源步骤),并收到了相同的一组错误。 我在这里感到不知所措,并希望就如何解决这个问题提供任何意见。

编辑:似乎它保持失败的FullArchivePathFileName – 它永远不会计算expression式即使我已设置为“真”。 仍然困惑为什么它不评估它。 所以我做了与FullSourcePathFileName相同的expression式,并validation了EvaluateAsExpression标志设置为True。 它仍然不评估这个variablesFullSourcePathFileNamevariables正在被评估。

SSIS 2005创build的以下示例从给定文件夹中读取CSV文件,并将数据插入到SQL表中。 将数据导入SQL后,文件将使用“文件系统任务”移至“存档”文件夹。

循序渐进的过程:

  1. 在pathC:\ temp中创build一个名为Archive的文件夹。 创build两个名为File_1.csv和File_2.csv的CSV文件,并用数据填充它们。 将存档文件夹留空。 请参阅截图# 1 – # 4

  2. 在SSIS包上创build5个variables,如屏幕截图# 5所示。 使用值C:\temp\设置variablesRootFolder 。 使用值*.csv设置variablesFilePattern

  3. selectvariablesFilePath并按F4打开属性,将属性EvaluateAsExpression更改为True并使用值@[User::RootFolder] + @[User::FileName]设置Expression属性,如截图# 6所示。

  4. selectvariablesArchiveFolder ,然后按F4打开属性,将属性EvaluateAsExpression更改为True并使用值@[User::RootFolder] + "Archive\\"设置Expression属性,如屏幕截图# 7所示。

  5. 在SSIS包的连接pipe理器上,创build一个名为CSV的新的平面文件连接。 请参阅截图# 8 。 configuration平面文件连接,如屏幕截图# 9 – # 13所示 。 另外,创build一个名为SQLServer的OLE DB连接来连接到SQL Server数据库。 连接创build后,它应该看起来像截图# 14所示。

  6. 右键单击平面文件连接CSV并select属性,然后使用省略号buttonconfiguration值为@ [User :: FilePath]的ConnectionStringexpression式,如屏幕截图# 15 – # 16所示

  7. 使用SQL Scripts部分下提供的脚本在SQL Server中创build一个名为dbo.Items的表。 CSV文件数据将被插入到此表中。

  8. 在“控制stream”选项卡上,放置一个Foreach Loop containerData Flow TaskFile System Task ,如屏幕截图# 17所示。

  9. configurationForeach循环容器,如屏幕截图# 18 – # 19所示

  10. 在数据stream任务中,放置一个平面文件源,派生列转换和一个OLE DB目标,如截屏# 20所示。

  11. configuration平面文件源,如屏幕截图# 21和# 22所示 。 这将从CSV文件中读取数据。

  12. configuration派生列转换,如屏幕截图# 23所示。 这用于使用相同名称的variables创buildFilePath列值。

  13. 如屏幕截图# 24和@ 25所示configurationOLE DB目的地。 这会将数据插入到SQL表中。

  14. 在控制stream选项卡上,configuration文件系统任务,如屏幕截图# 26所示。 请注意,在移动文件操作的同时, DestinationVariable只能被指定为一个目录,而不能被指定为完整的文件path。 如果指定了文件path,将会收到错误消息[File System Task] Error: An error occurred with the following error message: "Could not find a part of the path.".

  15. 屏幕截图# 28显示了在执行包之前表中没有数据。

  16. 屏幕截图# 29和# 30显示了“控制stream”和“数据stream”选项卡中的软件包执行情况。

  17. 屏幕截图# 31和# 32显示文件已被移到存档文件夹。

  18. 屏幕截图# 33显示了程序包执行后表中的数据。

  19. 在文件系统任务上,属性OverwriteDestination被设置为False (这是默认值)。 如果将相同名称的文件移动到“存档”文件夹,则会出现[File System Task] Error: An error occurred with the following error message: "Cannot create a file when that file already exists. ". 如屏幕截图# 34所示。 为避免这种情况,将OverwriteDestination设置为True,或者另一个选项是重命名文件并将其复制到Archive文件夹,然后将其删除。

希望有所帮助。

SQL脚本:

 CREATE TABLE [dbo].[Items]( [Id] [int] IDENTITY(1,1) NOT NULL, [ItemNumber] [varchar](30) NOT NULL, [Price] [numeric](18, 2) NOT NULL, [FilePath] [varchar](255) NOT NULL, CONSTRAINT [PK_Items] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY] GO 

屏幕截图#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

屏幕截图#16:

16

屏幕截图#17:

17

屏幕截图#18:

18

屏幕截图#19:

19

屏幕截图#20:

20

截图#21:

21

屏幕截图#22:

22

屏幕截图#23:

23

屏幕截图#24:

24

屏幕截图#25:

25

屏幕截图#26:

26

屏幕截图#27:

27

屏幕截图#28:

28

屏幕截图#29:

29

屏幕截图#30:

三十

屏幕截图#31:

31

屏幕截图#32:

32

屏幕截图#33:

33

屏幕截图#34:

34