2013-04-10 65 views
0

我有一个SSIS数据流任务,可以读取某些字段的CSV文件,稍微调整一下并将结果插入表格。源文件名是一个包参数。那里一切都很好。如何使SSIS根据参数选择数据源?

现在,我需要处理略有不同类型的CSV文件和一个额外的字段。这个额外的字段可以安全地忽略,所以处理过程基本上是一样的。唯一的区别是在数据源的列映射中。当然,我可以创建整个包的副本并调整数据源以匹配第二种文件格式。然而,这个“解决方案”看起来很糟糕的重复:如果处理过程中有任何变化,我将不得不做两次。我宁愿将另一个参数传递给包来告诉它要处理的文件类型。

麻烦的是,我不知道如何根据参数从一个数据源或另一个数据源读取SSIS,因此这个问题。

+0

可能是这个问题的重复,所以我会看看我的答案不适用于此。 http://stackoverflow.com/questions/8168548/ssis-task-for-inconsistent-column-count-import/8173162#8173162 – billinkc 2013-04-10 20:21:12

+0

这可能工作。我会检查出来并让你知道。 – 2013-04-10 20:54:44

+0

第二个想法是,只有两种CSS文件具有完全相同的列名时,这可能会适用,可能按不同顺序并且省略一些列。例如。如果一个文件具有“Price”列而另一个具有“FinalPrice”,那么将需要条件查询逻辑,因此原始问题就成立了。 – 2013-04-10 21:04:05

回答

1

我会复制SSIS包中的连接管理器(CSV定义)和数据流,并将它们调整为新的文件格式。然后,我将使用您描述的参数启用/禁用任何数据流。

实质上,SSIS不支持可变元数据。如果这将是一个反复出现的模式,我会从SSIS上游处理它,建立一个VB/C#命令行应用程序将文件分解成SQL表格。

0

您可以让连接管理器将所有数据推送到1列。然后使用脚本转换组件将数据解析到输出,具体取决于行中字段的数量。

您可以根据分隔符将数据拆分成一个字符串数组(当我需要这样做时,我会搜索帮助)。通过数组,你可以知道它的大小以及它连接到的文件类型。

然后,您到目标的映射可以保持不变。无需复制任何组件。

我不得不自己做一次类似的事情,因为尽管我使用的文件是始终是相同的格式 - 取决于发送文件的系统版本,它可能会更改 - 因此通过在脚本转换这种方式我能够处理文件格式的微小变化。如果这些文件是99%总是相同的,那么可以。如果它们完全不同,那么最好使用单独的文件连接管理器。