SSIS任务导致列计数不一致导入?

时间:2011-11-17 14:15:08

标签: c# sql-server ssis

问题。

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

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

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

任何建议,样本或指示都将受到重视。

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

2 个答案:

答案 0 :(得分:10)

在我的头顶,我有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并在ConnectionManager上设置"Data Source=" + @[User::InputFolder] + ";Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=\"text;HDR=Yes;FMT=CSVDelimited;\";"

的表达式

控制流程

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

control flow

Foreach文件枚举器

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

,而不是默认的“完全限定”

Foreach File Enumerator - Collection tab

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

Foreach File Enumerator - Variable Mappings tab

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

数据流

这实际上是最简单的一块。使用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

缺少什么

我不知道如何告诉基于查询的方法,如果列不存在则可以。如果有唯一键,我想你可以定义你的查询只包含必须的列,然后对文件执行查找以尝试获取应该的列>如果列不存在,那么查找并不会失败。虽然很漂亮。

答案 1 :(得分:5)

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