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

wer*_*eld 15 ssis sql-server-2005

一旦我完成了一些数据流任务项,我试图将一组文件从源路径归档到归档路径.在Foreach循环容器内部我有:脚本任务 - >数据流任务 - >执行SQL任务 - >文件系统任务

我有一个User变量设置为Foreach循环容器中的Collection设置下的"Name and extension"项.该变量称为"fileName",用于脚本任务(用于解析文件中的信息并执行执行SQL任务)以及平面文件连接管理器中的数据流任务,而后者又用于平面文件源元素.然后我解析文件并将数据插入数据库.一切正常,直到我进入文件系统任务(FST).

我想要的是一旦插入完成后将文件移动到存档文件夹.在线使用几个链接(这里,这里这里)我添加了不同的变量,这些变量要么是硬编码的,要么是通过按摩其他变量得出的.在任何情况下,会发生的事情是在FST上我得到的错误包括"路径中的无效字符"或"未知路径".如果我尝试按下上面链接的示例以适应我的文件系统结构,我现在在数据流任务中的平面文件源步骤上收到错误,指出它无法找到指定的文件.这是因为它一)无法找到文件路径,因为没有文件路径给,只是filname.ext B)无法解析包含完整路径源文件(变量引起@FullSourcePathFileName有其值设置为@[User::SourcePath]+ @[User::fileName])

我已经测试了其他各种修改,包括完全按照我发布的第一个示例(但实际上并没有对数据流任务执行任何操作,因此我只添加了一个没有目标的平面文件源步骤)并收到了同样的错误集.我在这里不知所措,想要了解如何解决这个问题.

编辑:似乎它一直在失败FullArchivePathFileName- 它永远不会评估表达式,即使我将它设置为'True'.仍然混淆为什么它没有评估它.因此我将其表达式与其相同FullSourcePathFileName并验证了EvaluateAsExpression标志设置为True.它仍然没有评估这个变量FullSourcePathFileName.正在评估变量.

小智 64

以下示例在SSIS 2005从给定文件夹中读取CSV文件时创建,并将数据插入到SQL表中.将数据导入SQL后,使用"文件系统任务"将文件移动到"存档"文件夹.

分步过程:

  1. 在路径C:\ temp中创建名为Archive的文件夹.创建两个名为File_1.csv和File_2.csv的CSV文件,并用数据填充它们.将Archive文件夹保留为空.参考截图#1 - #4.

  2. 在SSIS包上创建5个变量,如屏幕截图#5所示.使用值设置变量RootFolderC:\temp\.使用值设置变量FilePattern*.csv.

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

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

  5. 在SSIS包的连接管理器上,创建名为CSV的新平面文件连接.参见截图#8.配置平面文件连接,如屏幕截图#9 - #13所示.此外,创建名为SQLServer的OLE DB连接以连接到SQL Server数据库.创建连接后,它应如截屏#14中所示.

  6. 右键单击平面文件连接CSV并选择属性,并使用省略号按钮配置值为[User :: FilePath]的ConnectionString Expression,如屏幕截图#15 - #16所示.

  7. dbo.Items使用SQL Scripts部分下提供的脚本创建SQL Server 中指定的表.CSV文件数据将插入此表中.

  8. 在控制流标签,放置Foreach Loop container,Data Flow Task并且File System Task显示在屏幕截图#作为17.

  9. 配置Foreach循环容器,如屏幕截图#18 - #19所示.

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

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

  12. 配置派生列转换,如屏幕截图#23所示.这用于使用相同名称的变量创建FilePath列值.

  13. 配置OLE DB目标,如屏幕截图#24和@ 25所示.这会将数据插入SQL表中.

  14. 在"控制流"选项卡上,配置文件系统任务,如屏幕截图#26所示.请注意,在移动文件操作时,DestinationVariable只能将其指定为目录,并且不能将其指定为完整文件路径.如果指定文件路径,则会收到错误消息[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显示了"控制流"和"数据流"选项卡中的包执行.

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

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

  19. 在文件系统任务上,该属性OverwriteDestination设置为False(这是默认值).如果要将具有相同名称的文件移动到Archive文件夹,则会出现[File System Task] Error: An error occurred with the following error message: "Cannot create a file when that file already exists. ".屏幕截图#34中显示的错误.为了避免这种设置OverwriteDestination为True或另一种选择是重命名这些文件,并将其复制到归档文件夹,然后将其删除.

希望有所帮助.

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
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

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

  • 到目前为止,我读过的最清晰的解释.+1仅适用于此处包含的总信息.然而,这仍然不适合我.第4步我们创建ArchiveFolder变量= @ [User :: RootFolder] +"Archive \\"永远不会被评估.如果我在文件系统任务之前添加一个脚本任务,并且只是MsgBox输出该变量,则将其写为"@ [User :: RootFolder] +"Archive \\"".让我感到奇怪的是,对FilePath变量进行了评估.这两个都将其属性EvaluateasExpression设置为TRUE.我使用Scipt Task来设置路径. (4认同)