4

我们从供应商处获取每周数据文件(平面文件)以导入SQL,有时列名会更改添加新列。

我们目前拥有的是一个SSIS用于导入已定义列的包。由于我们已经分配了映射,因此只有在列不存在SSIS时才会引发错误但是,当添加新列(现有列除外)时,它根本不会被导入,因为它没有被命名。这是我们关心的问题。

我们想要的是获取平面文件中存在的所有列的列表,以便我们可以在导入文件之前检查是否存在任何新列。

我对 SSIS 比较陌生,因此非常感谢您提供详细的帮助。

谢谢!

4

7 回答 7

2

究竟如何编写代码将取决于平面文件布局的规则,但我会通过编写一个脚本任务来解决这个问题,该任务使用文件系统对象和 StreamReader 对象读取平面文件,并查看列,希望这些列在文件的第一行命名。

但是,如果列已更改,您所能做的就是发送警报。我知道无法动态更改您的数据转换任务以适应新列。必须对其进行编辑才能处理它们。坦率地说,如果您要做的只是发送警报,那么您不妨只使用错误处理程序来执行此操作,并省去预先阅读列列表的麻烦。

于 2013-05-01T15:29:13.980 回答
0

我曾为银行客户工作。由于美联储的要求和规则,银行不可能将列随机添加到数据库中。那就是说我得到了你没有受监管的业务。所以这里有一些步骤这不是代码问题,而是更多的软技能以及与其他团队(您和您的供应商)合作。您可以采取的步骤是: (1) 达到您始终需要的实心柱结构。因为对于较新的列,较旧的数据行将带有 NULL。(2) 如果供应商要发送新的列。如果要插入数据,您或您的团队需要对表进行 DDL/DML 更改。Ofcouse 的数据类型正确。(3) 在数据字典中记录这种变化,因为随着时间的推移,您或其他成员将对这些数据进行分析,并想知道每个属性或列的用途。(4) 长期而言,您不希望每月保持更改表结构,因为您的众多供应商之一决定更改向您发送数据的样式。一些客户非常积极地反击,而其他客户则没有那么多。

于 2015-06-08T20:15:41.387 回答
0

如果您可以选择第三方工具,请查看CozyRoc 的 Data Flow Task Plus。它处理源中的变量列。

于 2016-05-06T14:18:35.757 回答
0

SSIS 无法使列动态化,

于 2016-06-02T16:30:27.523 回答
0

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

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

“获取标题行”数据流看起来像这样。 如果需要,行号。

在此处输入图像描述

控制流级别看起来像这样。使用ForEach ADO RecordSet 对象将标题行值分配给 SSIS 变量CurrentHeader..

在此处输入图像描述

以上,先例约束(fx icons)

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

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

希望这可以帮助!

于 2016-11-29T13:09:55.520 回答
0

我总是做的一件事是使用脚本任务来读取文件的第一行和最后一行。

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

页眉显然很重要,但页脚也很重要。文件可以通过任何未知问题部分构建。请求将标头放在文件的后面是一个双重检查。

我也不知道 SSIS 是否可以动态地做到这一点,但它永远不会让我惊讶人们如何添加/更改列的顺序并假设事情仍然可以工作。

于 2016-12-24T12:37:03.903 回答
0

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

于 2017-03-08T18:25:31.193 回答