我们从供应商那里获得每周数据文件(平面文件)到导入到SQL,有时列名称更改或新列已添加。
我们目前拥有的SSIS
软件包可导入已定义的列。由于我们已分配映射,SSIS
仅在缺席列时才会引发错误。但是,如果新列添加(除了现有列),根本不会导入,因为它未命名。这是我们关注的问题。
我们想要的是获取平面文件中所有列存在的列表,以便我们可以在导入文件之前检查是否存在任何新列。
我对SSIS比较陌生,所以非常感谢详细的帮助。
谢谢!
答案 0 :(得分:2)
究竟如何编码这将取决于平面文件布局的规则,但我会通过编写reads the flat file using the file system object and a StreamReader object的脚本任务来查看,并查看列,希望在第一行中命名该文件。
但是,如果列已更改,您可以执行的所有操作都是发送警报。我知道无法动态更改数据转换任务以容纳新列。必须对其进行编辑才能处理它们。坦率地说,如果您要做的就是发送警报,您也可以使用错误处理程序来执行此操作,并省去了预读列列表的麻烦。
答案 1 :(得分:0)
我曾为银行客户工作过。并且由于馈送要求和规则,银行无法将列随机添加到数据库。那就是说我得到了你没有受到监管的调查。所以这里有一些步骤 这不是代码问题,而是更多的软技能,并与其他团队(您和您的供应商)合作。 您可以采取的步骤是: (1)达到您经常需要的实心柱结构。因为对于较新的列,较旧的数据行将携带NULL。 (2)如果供应商要发送新列。您或您的团队需要在插入数据后对表进行DDL / DML更改。正确数据类型的。 (3)随着时间的推移,您或其他成员将对此数据进行分析,并希望了解每个属性或列的用途,记录数据的这种变化。 (4)长期您不希望每月更改表结构,因为您的众多供应商之一决定更改发送数据的样式。有些客户非常积极地反击其他客户。
答案 2 :(得分:0)
如果您可以选择第三方工具,请查看CozyRoc's Data Flow Task Plus。它处理源中的变量列。
答案 3 :(得分:0)
SSIS无法使列动态化,
答案 4 :(得分:0)
我同意@TabAlleman提供的答案。 SSIS无法原生处理动态列(并且您的SQL目标也可以)。
我可以提出替代方案吗?您可以在不使用C#脚本任务的情况下检测标头中的更改。一种方法是创建一个flafile连接,将整行读作一列。使用条件拆分可以丢弃标题行以外的任何内容。将该行保存到RecordSet对象。任何改变?发送电子邮件。
"获取标题行" DataFlow看起来像这样。 Row Number如果需要的话。
控制流级别如下所示。使用ForEach ADO RecordSet对象将标题行值分配给SSIS变量CurrentHeader
..
以上,
的先例约束(fx图标)[@ExpectedHeader] == [@CurrentHeader]
[@ExpectedHeader] != [@CurrentHeader]
确定您是加载数据还是发送电子邮件。
希望这有帮助!
答案 5 :(得分:0)
我总是这样做,就是使用脚本任务来读取文件的第一行和最后一行。
如果它不是csv列的预期列表,我将文件标记为错误,并根据需要继续/失败。
标题显然很重要,但页脚也是如此。文件可以通过任何未知问题进行部分构建。请求标题放在文件的后面,这是一个双重检查。
我也不知道SSIS是否可以动态地执行此操作,但它永远不会让我惊讶于人们如何添加/更改列的顺序并假设事情仍然有效。
答案 6 :(得分:0)
1-SSIS不提供动态源和目标映射。但是一些第三方组件,如数据流任务加,支持此功能 2 - 我们可以使用ssis脚本任务来实现这一点。 3 - 如果Header是正确的进程进一步迁移,则在DFT执行之前包失败。 4-使用脚本任务从标题中读取行并存储在数组或列表对象中 5 - 然后将这些数组值与用户定义的变量进行比较,声明前面包含的默认值为列名。 6 - 如果值完全匹配,那么进一步使其失败。