假设一个平面文件F1.txt,列MyCol1和一个包Pkg1将所述文件加载到SQL服务器。
没问题,对吗?对。
现在假设一个平面文件F2.txt,列MyCol1,MyCol2和相同的包Pkg1将所述文件加载到SQL服务器。
我们会对Pkg1和presto进行一些调整 - 它会像梦一样加载F2.txt。
现在我们给它喂F1.txt,这就是事情恶化的地方。
顺便说一下,这并不局限于平面文件,而是更为一般性。欢迎任何和所有关于如何在同一个包中运行旧数据的建议。
TIA
彼得
答案 0 :(得分:1)
看起来你在这里有两个问题。首先是了解如何使用连接管理器。对于平面文件输入,通常可以通过为每个文件布局创建连接管理器来提供更好的服务。文件1看起来像(Column1),文件2看起来像(Column1,Column2)?这意味着需要定义2个不同的平面文件连接管理器。
如果您有2个版本的File 2,其中Column1有数字而另一个有Column1包含字符数据,那么这些将需要2个唯一的连接管理器(总共3个)。
与上述相关的好消息是文件名更改很简单,不需要创建唯一的Connection Manager。 F1.txt,F1_20120501.txt,F1.good.txt等都将由您为该布局定义的Connection Manager提供服务。您只需要在给定的Connection Manager的ConnectionString属性上使用表达式来在运行时更新当前包。
现在您拥有所有这些平面文件连接管理器,您需要使用它们。这种魔力发生在数据流任务中。数据流对于其中使用的元数据是真实的。当您设计数据流时,您正在与SSIS签订合同,如果您试图通过将字符字段放入日期字段或不提供所有列来违反它,那么包将无法通过验证检查,因为您没有持有结束讨价还价。解决这个问题的方法是,您需要在软件包所需的各种连接管理器周围定义多个数据流。
通过所有定义,您只需要一个协调器来查看源文件以确定应该执行哪个数据流。我提供了一个关于这个问题的例子Create SSIS package to import from one of many data sources
还有一个类似的问题,我提出了一个可能感兴趣的解决方案SSIS Task for inconsistent column count import?这实际上取决于你的规则是什么用于处理。
如果您正在尝试在SSIS包中合并/重用业务逻辑,那么我会看一种使用各种数据流将离散源转换为单一数据存储事物的方法(原始文件,具有大量null的登台表)列等。)