在SSIS中获取源平面文件的列列表

4
我们每周从供应商那里得到数据文件(平面文件),需要将其导入SQL中,有时列名会发生更改或添加新列。
目前我们使用SSIS包来导入已定义的列。由于我们已经分配了映射,只有当缺少某个列时,SSIS才会报错。但是,当添加一个新列时(除了现有的列),它根本不会被导入,因为它没有名称。这让我们感到担忧。
我们想要获取平面文件中所有存在的列的列表,以便在导入文件之前检查是否有任何新列存在。
我对SSIS相对较新,所以非常感谢详细的帮助。
谢谢!

只是提醒一下,这取决于新列实际添加的位置。如果它在中间某个地方,所有列都会向右移动,除非指定了一些非常通用的数据类型,否则在发现数据不匹配时会抛出错误。如果在末尾添加列,则数据将与最后一列中的其他数据连接起来。同样,根据最后一列的数据类型,SSIS可能会抛出错误,也可能不会。确定新/旧列后,您是否会手动更改SSIS包中的映射? - Milen Kindekov
如果确定有新列,我将手动更改SSIS包中的映射。我需要的是一个自动化的方法来找出已添加的新列。 - Lews
7个回答

2
确切地说如何编写代码取决于平面文件布局的规则,但我会通过编写一个脚本任务来处理这个问题,使用文件系统对象和StreamReader对象读取平面文件, 并查看列,这些列应该在文件的第一行中命名。
然而,如果列已更改,你所能做的就是发送警报。我不知道有什么方法可以动态更改数据转换任务以适应新列。它必须被编辑以处理它们。而且说实话,如果你要做的只是发送一个警报,那么你最好使用错误处理程序来完成,并省去预读列列表的麻烦。

0

我同意@TabAlleman提供的答案。SSIS无法本地处理动态列(你的SQL目标也不能)。

我可以提出一个替代方案吗?您可以检测标题的更改,而不使用C#脚本任务。一种方法是创建一个flafile连接,将整个行读取为单个列。使用条件分割来丢弃除标题行以外的任何内容。将该行保存到RecordSet对象中。有任何更改吗?发送电子邮件。

"获取标题行" DataFlow看起来像这样。如果需要,行号

enter image description here

控制流程级别将如下所示。使用ForEach ADO RecordSet对象将标题行的值分配给SSIS变量CurrentHeader

enter image description here

以上是先决约束条件(例如图标)的内容

[@ExpectedHeader] == [@CurrentHeader]
[@ExpectedHeader] != [@CurrentHeader]

确定是要加载数据还是发送电子邮件。

希望这可以帮到你!


0
我曾为银行客户工作。对于银行随意向数据库添加列是不可能的,因为联邦要求和规定。话虽如此,我明白你们的业务没有受到联邦监管。所以这里有一些步骤:
这不是代码问题,而是软技能和与其他团队(你的团队和供应商)合作的问题。
你可以采取以下步骤:
(1)确定一个稳定的列结构,你总是需要它。因为对于新的列,旧的数据行将携带NULL。
(2)如果供应商将发送一个新的列。你或你的团队需要对表进行DDL/DML更改,以便插入数据。当然,要使用正确的数据类型。
(3)在数据字典中记录这个变化,因为随着时间的推移,你或其他成员会对这些数据进行分析,并想知道每个属性或列的用途。
(4)从长远来看,你不希望每月都更改表结构,因为你的许多供应商决定更改发送给你数据的方式。有些客户会非常强硬地反对,而有些则不会。

0

我经常使用脚本任务来读取文件的第一行和最后一行。

如果它不是预期的CSV列列表,我会将文件标记为错误,并根据需要继续/失败。

标题显然很重要,但页脚也很重要。文件可能会因为任何未知问题而部分构建。要求将标题放在文件末尾进行双重检查。

我也不知道SSIS是否可以动态地执行此操作,但令我惊讶的是,人们添加/更改列的顺序并认为事情仍然可以正常工作。


0

1-SSIS不提供动态源和目标映射,但一些第三方组件(如Data flow task plus)支持此功能。 2-我们可以使用ssis脚本任务来实现这一点。 3-如果标题正确,则继续进行迁移处理,否则在DFT执行之前失败包。 4-使用脚本任务从头读取行,并将其存储在数组或列表对象中。 5-然后将这些数组值与先前声明包含列名默认值的用户定义变量进行比较。 6-如果值完全匹配,则继续进行,否则失败。


0

0

SSIS 无法使列动态化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接