【问题标题】:SSIS won't execute foreach loop for dynamic xlsx filename [duplicate]SSIS不会为动态xlsx文件名执行foreach循环[重复]
【发布时间】:2019-08-31 04:07:39
【问题描述】:

我有一个 xlsx 文件,该文件将每月放入一个文件夹中。文件名将根据日期每月更改(filename_8292019),我无法更改。

我想构建一个 foreach 循环来获取 xlsx 文件并对其进行操作(加载到 SQL 服务器表中,将文件移动到存档文件夹)。我无法弄清楚如何使用动态文件名(日期更改。

在将 xlsx 转换为 CSV 以及直接指向 xlsx 文件名时,我能够成功运行包。

[平面文件目标 [219]] 错误:无法打开数据文件“文件名” 或与未找到文件有关的错误

【问题讨论】:

    标签: excel ssis


    【解决方案1】:

    Foreach Loop 容器的Collection 选项卡上的Files: 条目将接受通配符。

    这里的一般模式是创建一个变量,比如FileName。将您的 Files: 设置为:

    Files:
    BaseFileName*
    

    或者,如果您想确保只选择电子表格,也许:

    Files:
    BaseFileName*.xlsx
    

    选择Name and extensionFully qualified,这将包括完整的文件路径。我通常只使用Name and extension 并将文件路径放入另一个变量中,因此当 Ops 告诉我他们正在移动我的放置位置时,我可以更改参数而不是编辑包。此步骤告诉容器记住它刚刚找到的文件的名称,以便您以后可以将其用于变量映射。

    Variable Mappings 选项卡上,选择您的变量名称并将其分配给Index 0。

    然后,对于每个电子表格,容器将循环,选择它找到的第一个与您的模式匹配的文件的名称,并分配全名,带有日期扩展名(和路径,如果你这样做的话),到你的变量。将变量作为输入参数传递给循环内的任务并使用它来处理文件,包括将其移动到存档,否则您将陷入无限循环,一遍又一遍地处理相同的文件。

    编辑:

    这里,FullFilePath 变量只是文件夹名称,没有文件引用。 (Folder 框中的红色变量到红色条目)。

    FileBaseName 变量驱动Files 框中显示的内容。 (蓝色到蓝色)。

    另一个变量获取带有日期扩展名的实际文件名。稍后,在File System Task 中说,如果我需要将文件夹和文件名放在一起,我会将变量连接起来。

    就您遇到的Excel Connection Manager 错误而言,不幸的是我无能为力。我不使用它。我们有用于 SSIS 的 SentryOne 任务工厂,其中包括一个更具弹性的 Excel 连接器。

    【讨论】:

    • 谢谢。 2 澄清:文件路径是否必须指向特定文件,即使它会循环多个?当我在那里列出一个文件夹时,它不起作用。另外,当您说使用变量作为输入参数时,是在连接字符串下的表达式区域中吗?然后变量作为表达式?
    • 验证错误。 Package1 连接管理器“Excel 连接管理器”:连接字符串格式无效。它必须由一个或多个 X=Y 形式的组件组成,用分号分隔。在数据库连接管理器上设置零组件的连接字符串时会发生此错误。
    • 尽我所能编辑了答案。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多