Sql SSIS:Excel数据源-如果列不存在,请使用其他列

Sql SSIS:Excel数据源-如果列不存在,请使用其他列,sql,sql-server,excel,ssis,etl,Sql,Sql Server,Excel,Ssis,Etl,我正在使用excel源代码中的select语句从excel中选择特定的列数据进行导入 但我想知道,当我选择例如名为column_1的列时,是否可以这样选择数据,但如果excel中不存在此列,则它将尝试选择名为column_2的列?当前,如果列_1缺失,则数据流任务失败 使用脚本任务并编写.net代码来读取excel文件,然后检查文件中列_1的可用性。如果列不存在,则使用列_2作为输入。SSIS中的脚本任务可以用作源。SSIS基于元数据,不支持动态元数据,但是您可以使用@nitin raj建议的脚

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


但我想知道,当我选择例如名为column_1的列时,是否可以这样选择数据,但如果excel中不存在此列,则它将尝试选择名为column_2的列?当前,如果列_1缺失,则数据流任务失败

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

SSIS基于元数据,不支持动态元数据,但是您可以使用@nitin raj建议的脚本组件来处理所有已知的源列。下面有一篇关于如何做到这一点的好帖子

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


如果列列表不断变化,并且您无法提前知道预期的列,那么您最好使用控制流的脚本任务在C/VB.Net中处理整个过程。最简单的方法是添加两个数据流任务,每个Excel源select语句有一个数据流,当第一个数据流失败时,使用优先约束执行第二个数据流

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

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

有用的链接
作为最佳实践,因为SSIS元数据是静态的,所以在运行SSIS数据流任务之前,应更正源文件中的任何数据质量和格式问题

我以前见过这种情况,有一个非常简单的解决方法。在ssis包的开头,使用文件任务创建源excel文件的副本,然后运行c脚本或执行powershell重命名列,以便在列1不存在时,将其添加到excel文件中的适当位置,或者在列名错误的情况下进行更正


因此,您不需要每次ssis元数据出现故障时都刷新它。这是一个标准的数据标准化实践

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