【问题标题】:SSIS Task for inconsistent column count import?SSIS任务不一致的列计数导入?
【发布时间】:2011-11-17 14:15:08
【问题描述】:

问题。

我经常收到来自不同供应商的提要文件。尽管列名是一致的,但当一些供应商发送的文本文件在提要文件中包含更多或更少的列时,就会出现问题。

此外,这些文件的排列不一致。

除了 Cozy Roc 提供的动态数据流任务之外,我还有其他方法可以导入这些文件。我不是 C# 大师,但我使用“脚本任务”控制流或“脚本组件”数据流任务来驱动。

任何建议、示例或指导将不胜感激。

http://www.cozyroc.com/ssis/data-flow-task

一些论坛

http://www.sqlservercentral.com/Forums/Topic525799-148-1.aspx#bm526400

http://www.bidn.com/forums/microsoft-business-intelligence/integration-services/26/dynamic-data-flow

【问题讨论】:

  • 当他们提供多余的列时,您如何处理“额外”数据?你导入它还是忽略它?这些文件有多大,或者换句话说,速度对您来说有多重要?
  • 我想忽略多余的列。并为缺少的列创建一个幻列。

标签: c# sql-server ssis


【解决方案1】:

我想不到,我有一个 50% 的解决方案给你。

问题

SSIS 真的关心元数据,因此元数据的变化往往会导致异常。从这个意义上说,DTS 要宽容得多。对一致元数据的强烈需求使得使用平面文件源很麻烦。

基于查询的解决方案

如果问题出在组件上,我们就不要使用它。我喜欢这种方法的地方在于,从概念上讲,它与查询表相同——列的顺序无关紧要,额外列的存在也无关紧要。

变量

我创建了 3 个变量,均为字符串类型:CurrentFileName、InputFolder 和 Query。

  • InputFolder 硬连线到源文件夹。在我的例子中,它是C:\ssisdata\Kipreal
  • CurrentFileName 是文件的名称。在设计时,它是input5columns.csv,但在运行时会改变。
  • 查询是一个表达式"SELECT col1, col2, col3, col4, col5 FROM " + @[User::CurrentFilename]

连接管理器

使用JET OLEDB driver 建立与输入文件的连接。按照链接文章中的说明创建后,我将其重命名为 FileOLEDB 并在 "Data Source=" + @[User::InputFolder] + ";Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=\"text;HDR=Yes;FMT=CSVDelimited;\";" 的 ConnectionManager 上设置表达式

控制流程

我的控制流看起来像嵌套在 Foreach 文件枚举器中的数据流任务

Foreach 文件枚举器

我的 Foreach 文件枚举器配置为对文件进行操作。我在@[User::InputFolder] 的目录上放置了一个表达式。请注意,此时,如果该文件夹的值需要更改,它将在连接管理器和文件枚举器中正确更新。在“检索文件名”中,选择“名称和扩展名”,而不是默认的“完全限定”

在“变量映射”选项卡中,将值分配给我们的 @[User::CurrentFileName] 变量

此时,循环的每次迭代都会改变@[User::Query的值以反映当前文件名。

数据流

这实际上是最简单的部分。使用 OLE DB 源并按照说明进行连接。

使用 FileOLEDB 连接管理器并将数据访问模式更改为“来自变量的 SQL 命令”。在其中使用@[User::Query] 变量,单击“确定”,您就可以开始工作了。

样本数据

我创建了两个示例文件 input5columns.csv 和 input7columns.csv 5 的所有列都在 7 中,但 7 的顺序不同(col2 是序数位置 2 和 6)。我否定了 7 中的所有值,以便清楚地看出正在对哪个文件进行操作。

col1,col3,col2,col5,col4
1,3,2,5,4
1111,3333,2222,5555,4444
11,33,22,55,44
111,333,222,555,444

col1,col3,col7,col5,col4,col6,col2
-1111,-3333,-7777,-5555,-4444,-6666,-2222
-111,-333,-777,-555,-444,-666,-222
-1,-3,-7,-5,-4,-6,-2
-11,-33,-77,-55,-44,-666,-222

运行包会得到这两个屏幕截图

缺少什么

我不知道如何告诉基于查询的方法如果列不存在也没关系。如果有唯一键,我想您可以将查询定义为只有 必须 存在的列,然后对文件执行查找以尝试获取 应该 如果该列不存在,则存在并且不会使查找失败。不过很笨拙。

【讨论】:

  • 制表符分隔文件有点问题。我试图将扩展属性从 FMT=CSVDelimited 更改为 FMT=TabDelimited。
  • 嗯,很有趣。似乎它排除了使用批量插入的能力。可能用作错误条件后的后备以重新排序行。
【解决方案2】:

我们的解决方案。我们使用父子包。在父包中,我们获取各个客户端文件并将它们转换为我们的标准格式文件,然后调用子包以使用我们创建的文件处理标准导入。这仅在客户发送的内容一致的情况下才有效,如果他们尝试更改他们同意发送给我们的格式,我们会返回文件。

【讨论】:

  • 我将它用于我的一些应用程序。但客户群越来越大。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
相关资源
最近更新 更多