【问题标题】:Use SSIS to import multiple .csv files that each have unique columns使用 SSIS 导入多个 .csv 文件,每个文件都有唯一的列
【发布时间】:2016-11-21 08:34:37
【问题描述】:

我在创建执行以下操作的 SSIS 项目时一直遇到问题: 检查文件夹中的 .csv 文件 -> 每个 csv 文件 -> 插入 [db]。[每个 .csv 文件的名称]

数据库中的每个 csv 和对应的表都有自己独特的列

我已经尝试了许多文章中的 foreach 循环,但问题归结为平面文件连接。似乎每个 csv 文件都具有与其之前的文件相同的列,并且在没有显示此列名时会出错。

有人知道解决这个问题的方法吗?

【问题讨论】:

    标签: sql-server csv ssis


    【解决方案1】:

    每个平面文件格式都必须有自己的连接,因为连接告诉 SSIS 如何解释文件中包含的数据集。如果它不存在,则与告诉 SQL 服务器您希望从数据库中取出数据但不指定表或其列相同。

    我想您必须考虑的事情是您将如何告诉数据流任务源组件中的哪一列将映射到目标组件?它总是相同的列名吗?如果没有连接管理器,就无法映射列,除非您动态地进行映射。

    仍然有几种方法可以做你想做的事,你只需要四处搜索,因为我知道这个主题有答案。

    • 您可以创建一个脚本任务并在 .Net 中进行导入
    • 您可以创建一个 SQL 脚本任务并使用 BULK INSERT 或 OPENROWSET 到临时临时表中,然后使用动态 sql 映射和导入最终表。

    【讨论】:

      【解决方案2】:

      尝试保留包含以下列的映射表 文件位置 文件名 表名

      在表格中添加所有详细信息。 为所有列名创建用户变量,为结果集创建一个。 使用执行 SQL 任务从表中读取数据并将其保存在单个结果集变量中。

      对于每个循环,容器变量映射将所有列映射到用户变量。

      创建两个连接管理器,一个用于 Excel,另一个用于 csv 文件。 将 CSV 文件连接字符串传递为 @[User::FileLocation]+@[User::FileName]

      在每个循环容器内部使用批量插入并分配源和目标连接以及表名作为 User::TableName 参数。

      如果您需要任何详细信息,请发布,如果有用,我会尽力帮助您。

      【讨论】:

        【解决方案3】:

        您可以查看 BiML 脚本,它根据可用的元数据动态创建和执行包。

        【讨论】:

          【解决方案4】:

          我在这里为您提供了 2 个选项。

          1)Scrip组件,用于在sql server中动态创建表结构。

          2) 对于每个循环容器,使用带有 OPENROWSET 子句的 EXECUTE SQL TASK。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-09-18
            • 2015-05-03
            • 2016-10-30
            • 2020-08-31
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多