【问题标题】:SSIS: Excel data source - if column not exists use other columnSSIS:Excel 数据源 - 如果列不存在,则使用其他列
【发布时间】:2020-05-13 21:11:07
【问题描述】:

我在 excel 源中使用 select 语句从 excel 中选择特定列数据进行导入。

但我想知道,当我选择名称为Column_1 的列时,是否可以这样选择数据,但如果excel 中不存在此列,那么它将尝试选择名称为Column_2 的列?当前,如果缺少Column_1,则数据流任务失败。

【问题讨论】:

  • “列 1”和“列 2”是否具有相同的数据类型?如果是这样,您可以为该列设置别名并基于其中一个创建数据流。并在控制流中使用脚本任务来测试列名并创建 SQL 语句来提取正确的列

标签: sql sql-server excel ssis etl


【解决方案1】:

最简单的方法是添加两个数据流任务,每个Excel源选择语句一个数据流,并在第一个数据流失败时使用优先约束执行第二个数据流。

这种方法的缺点是,如果第一个数据流任务由于其他原因失败,它也会尝试执行第二个。您将需要一些高级错误处理来检查是否由于缺少列而引发错误。

但是如果有类似的情况,我会使用脚本任务来检查列是否存在并动态构建 SQL 命令。请注意,此 SQL 命令必须始终返回相同的元数据(您必须使用别名)。

有用的链接

【讨论】:

    【解决方案2】:

    作为最佳实践,由于 SSIS 元数据是静态的,因此在运行 ssis 数据流任务之前,应更正源文件中的任何数据质量和格式问题。

    我以前见过这种情况,有一个非常简单的解决方法。在 ssis 包的开头,使用文件任务创建源 excel 文件的副本,然后运行 ​​ac# 脚本或执行 powershell 重命名列,以便如果第 1 列不存在,则在适当的位置添加在 excel 文件中发现或如果列名错误,是否已更正。

    因此,您无需在每次失败时刷新 ssis 元数据。这是标准的数据标准化实践。

    【讨论】:

      【解决方案3】:

      SSIS 是基于元数据的,不支持动态元数据,但是您可以使用 Script Component 正如@nitin-raj 建议的那样来处理所有已知的源列。下面有一篇关于如何完成的好帖子。

      Dynamic File Connections

      如果您有许多这样的文件可以有不同的列,那么最好创建一个自定义组件。但是,即使使用自定义组件,您也不能拥有动态元数据,SSIS 应该预先知道列集。

      如果列的列表不断变化并且您无法提前知道预期的列,那么您最好使用控制流的脚本任务在 C#/VB.Net 中处理整个事情 p>

      【讨论】:

        【解决方案4】:

        使用脚本任务并编写 .net 代码来读取 excel 文件,然后检查文件中 Column_1 的可用性。如果该列不存在,则使用 Column_2 作为输入。 SSIS 中的脚本任务可以作为源。

        【讨论】:

          猜你喜欢
          • 2013-09-01
          • 1970-01-01
          • 2022-07-11
          • 1970-01-01
          • 2014-10-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-01
          • 2018-06-09
          相关资源
          最近更新 更多