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