【问题标题】:How do I move files to an archive folder after the files have been processed?处理完文件后,如何将文件移动到存档文件夹?
【发布时间】:2011-10-05 14:23:10
【问题描述】:

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

我在 Foreach 循环容器的集合设置下将用户变量设置为“名称和扩展名”项。该变量称为“fileName”,用于脚本任务(用于从文件中解析信息并执行执行 SQL 任务)以及平面文件连接管理器中的数据流任务,后者又由平面文件源元素。然后我解析文件并将数据插入数据库。在我执行文件系统任务 (FST) 之前,一切正常。

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

我已经测试了其他各种修改,包括完全按照我发布的第一个示例中的内容进行操作(但是那个实际上并没有对数据流任务做任何事情,所以我只是添加了一个没有目标的平面文件源步骤)并收到了相同的结果一组错误。我在这里不知所措,想了解如何解决这个问题。

编辑: 似乎它在FullArchivePathFileName 上一直失败 - 即使我将它设置为“True”,它也从不评估表达式。仍然对它为什么不评估它感到困惑。因此,我将其表达式设为与FullSourcePathFileName 相同,并验证 EvaluateAsExpression 标志设置为 True。它仍然没有评估这个变量。FullSourcePathFileName 变量的评估很好。

【问题讨论】:

    标签: sql-server-2005 ssis


    【解决方案1】:

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

    分步过程:

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

    2. 在 SSIS 包上创建 5 个变量,如屏幕截图 #5 所示。将变量 RootFolder 设置为值 C:\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 并选择属性,然后使用省略号按钮将 ConnectionString 表达式配置为值为 @[User::FilePath],如屏幕截图所示 #15 - # 16

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

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

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

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

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

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

    13. 如屏幕截图 #24 和 @25 所示配置 OLE DB 目标。这会将数据插入到 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(这是默认值)。如果您将同名文件移动到存档文件夹,您将收到屏幕截图中显示的错误 [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
    

    屏幕截图 #1:

    屏幕截图 #2:

    截图#3:

    屏幕截图 #4:

    屏幕截图 #5:

    屏幕截图 #6:

    截图#7:

    截图#8:

    屏幕截图 #9:

    屏幕截图 #10:

    屏幕截图 #11:

    屏幕截图 #12:

    屏幕截图 #13:

    屏幕截图 #14:

    屏幕截图 #15:

    屏幕截图 #16:

    屏幕截图 #17:

    屏幕截图 #18:

    屏幕截图 #19:

    屏幕截图 #20:

    屏幕截图 #21:

    屏幕截图 #22:

    屏幕截图 #23:

    屏幕截图 #24:

    屏幕截图 #25:

    屏幕截图 #26:

    屏幕截图 #27:

    屏幕截图 #28:

    屏幕截图 #29:

    屏幕截图 #30:

    屏幕截图 #31:

    屏幕截图 #32:

    屏幕截图 #33:

    屏幕截图 #34:

    【讨论】:

    • 迄今为止我读过的最清晰的解释。 +1 仅用于此处包含的全部信息。但是,这仍然对我不起作用。第 4 步,我们创建 ArchiveFolder 变量 = @[User::RootFolder] + "Archive\\" 永远不会被评估。如果我在文件系统任务之前添加一个脚本任务,然后将 MsgBox 取出该变量,它会将其写为“@[User::RootFolder] +“Archive\\””。让我感到奇怪的是 FilePath 变量被评估。这两个都将其属性 EvaluateasExpression 设置为 TRUE。我使用 Scipt Task 设置路径解决了这个问题。
    • 叮!表达式中有一个时髦的 ASCII 字符。现在它解析了!非常感谢您为此争论不休。
    • 有了这样的答案,世界会更美好! +1 伴侣
    • 对我不起作用,但它帮助我实现了我的目标。塔恩克斯
    • SSIS 中的大师班。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    相关资源
    最近更新 更多