【问题标题】:SSIS pkg with flat-file connection with fewer columns will fail具有较少列的平面文件连接的 SSIS pkg 将失败
【发布时间】:2012-05-22 13:12:33
【问题描述】:

假设一个平面文件 F1.txt、列 MyCol1 和一个包 Pkg1 将所述文件加载到 SQL 服务器。

没问题吧?正确的。

现在假设一个平面文件 F2.txt、列 MyCol1、MyCol2 和相同的包 Pkg1 将所述文件加载到 SQL 服务器。

我们将对 Pkg1 和 presto 进行一些调整 - 它加载 F2.txt 就像做梦一样。

现在我们给它 F1.txt,这就是事情恶化的地方。

顺便说一句,这并不局限于平面文件,而是具有更一般的性质。

欢迎就如何在同一包中运行旧数据提出任何建议。

TIA

彼得

【问题讨论】:

  • 一旦您更改源,包元数据就会过期。通过这样说,我假设当您尝试加载 F2.txt 时,您实际上将 F1.txt 移动到了其他位置。
  • 我的答案应该是相反的(我没有找到我的评论的编辑按钮)“这么说,我假设当你尝试加载 F1.txt 时,你实际上移动了 F2.txt到其他地方”
  • 您可以为每种元数据类型创建一个数据流。然后在数据流之前,创建一个脚本任务,根据文件布局确定应该使用哪个数据流。

标签: ssis


【解决方案1】:

看起来你有两个问题。首先是了解如何使用连接管理器。对于平面文件输入,通常通过为每个文件布局创建一个连接管理器来为您提供更好的服务。文件 1 看起来像 (Column1) 而文件 2 看起来像 (Column1, Column2)?这意味着需要定义 2 个不同的平面文件连接管理器。

如果您有 2 个版本的文件 2,其中一个 Column1 包含数字,另一个 Column1 包含字符数据,则需要 2 个唯一的连接管理器(总共 3 个)。

与上述相关的好消息是文件名更改是微不足道的,并且不需要创建唯一的连接管理器。 F1.txt、F1_20120501.txt、F1.good.txt 等都将由您为该布局定义的连接管理器提供服务。您只需在给定连接管理器的 ConnectionString 属性上使用一个表达式,即可在运行时更新当前包。

现在您已经拥有了所有这些平面文件连接管理器,您需要使用它们。这种神奇发生在数据流任务中。数据流对其中使用的元数据非常挑剔。当您设计数据流时,您正在与 SSIS 签订合同,如果您试图通过将字符字段设置为日期字段或不提供所有列来违反它,则包将无法通过验证检查,因为您没有持有讨价还价。对此的解决方案是,您将再次需要围绕您的包所需的各种连接管理器定义多个数据流。

定义完所有这些后,您只需要一个协调器来查看源文件以确定应该执行哪个数据流。我提供了一个关于这个问题的例子Create SSIS package to import from one of many data sources

还有一个类似的问题,我提出了一个可能感兴趣的解决方案SSIS Task for inconsistent column count import? 这真的取决于您的处理规则。

如果您尝试在 SSIS 包中整合/重用业务逻辑,那么我会寻找一种使用各种数据流将离散源暂存为单一数据存储事物的方法(原始文件、带有大量 null 的暂存表列等)。

【讨论】:

  • 我认为 billinkc(那会是 KC 的比尔吗?)总结得很好。非常感谢您不厌其烦,我会看看两者。
猜你喜欢
  • 1970-01-01
  • 2019-12-13
  • 2011-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-22
  • 2010-12-23
相关资源
最近更新 更多