gpt4 book ai didi

c# - 列数导入不一致的 SSIS 任务?

转载 作者:太空狗 更新时间:2023-10-29 20:00:18 26 4
gpt4 key购买 nike

问题。

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

而且这些文件的排列也不一致。

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

如有任何建议、 sample 或指导,我们将不胜感激。

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

最佳答案

我想出了一个 50% 的解决方案。

问题

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

基于查询的解决方案

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

变量

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

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

variables window

连接管理器

使用 JET OLEDB driver 设置到输入文件的连接.按照链接文章中的描述创建它后,我将其重命名为 FileOLEDB,并在 "Data Source="+ @[User::InputFolder] + ";Provider=Microsoft.Jet.OLEDB 的 ConnectionManager 上设置了一个表达式。 4.0;扩展属性=\"text;HDR=Yes;FMT=CSVDelimited;\";"

控制流程

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

control flow

Foreach 文件枚举器

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

Foreach File Enumerator - Collection tab

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

Foreach File Enumerator - Variable Mappings tab

此时,循环的每次迭代都会更改 @[User::Query 的值以反射(reflect)当前文件名。

数据流

这实际上是最简单的一 block 。使用 OLE DB 源并按照指示连接它。

Data flow

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

示例数据

我创建了两个示例文件 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

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

5 column file 7 column file

缺少什么

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

关于c# - 列数导入不一致的 SSIS 任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8168548/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com