【问题标题】:Loading files with varying number of columns into the same table with SSIS使用 SSIS 将具有不同列数的文件加载到同一个表中
【发布时间】:2021-06-15 16:57:02
【问题描述】:

我需要将 14 个具有不同列数的不同文件加载到同一个表中。许多列是相同的,但每个文件都有一些特定于它们的列。每个文件的名称表示该文件将具有的列。 例如,文件“Temporary_Employees.txt”总是有这些列:

合同 ID |个人ID |聘用日期 |合同工期小时数 |经理_ID

并且文件“PartTime_Employees.txt”将包含这些列:

合同 ID |个人ID |聘用日期 |每周小时数 |经理_ID

目标表包含所有列。

我是 SSIS 新手,我能想到的唯一解决方案是拥有 14 个数据流和 14 个平面文件连接......有没有更好的方法来做到这一点?

【问题讨论】:

  • 您可以使用脚本块来创建和调用programmatic package:目标表包含所有可能的列;脚本块读取文件的标题行以确定源列;脚本块创建一个带有平面文件阅读器的程序包、一个目标表并映射它们之间的列。这适用于数百个不同的文件,但如果您只处理 14 个文件,则可能会付出更多的努力而不值得。
  • 是否可以将您的 .csv/.txt 文件转换为 XML 格式?如果答案是肯定的,那么使用 SSIS XML Source Adapter 就很容易了。 XML 元素是可选的,并且缺少任何标记 - 它将作为 NULL 值加载。

标签: sql-server ssis oledb flat-file


【解决方案1】:

您需要为每个独特的文件格式创建一个平面文件连接管理器。

如果存在共享格式 FullTime_Employees.txt 和 Management_Employees.txt,那么您可以使用 Foreach 文件枚举器循环文件(更改连接管理器的连接字符串属性)并让数据流使用更新后的连接管理器。

设计一个数据流来完成一项任务 - 这个加载兼职员工,这个加载临时员工,这个加载全职员工。可能感觉需要做更多的工作,但尝试任何聪明的东西都可能是调试的噩梦。

噩梦般的方法

SSIS Task for inconsistent column count import?

如果您不需要在目标中填充“额外”列,您可以使用我在上述旧答案中概述的查询方法。基本上,您将编写一个查询来枚举所有文件中通用的列名。这将导致一组一致的元数据可用,然后您可以使用 foreach 文件枚举器来处理所有文件。

我将此归类为噩梦般的方法,因为虽然它有效,但如果这是您首次涉足 SSIS,此解决方案包含了许多先进技术。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多