gpt4 book ai didi

file - 具有可变列号的 SSIS 平面文件

转载 作者:行者123 更新时间:2023-12-03 22:32:01 24 4
gpt4 key购买 nike

SSIS 在处理平面文件方面做了两件事,这特别令人沮丧,似乎应该有办法绕过它们,但我想不通。如果您定义一个包含 10 列的平面文件,以 CRLF 作为行尾标记的制表符分隔,这对于每行正好有 10 列的文件将非常有效。两个痛苦的场景是:

  • 如果有人在任何地方提供第 11 列的文件,如果 SSIS 只是忽略它会很好,因为您还没有定义它。它应该只读取您定义的 10 列,然后跳到行标记的末尾,但实际上是将任何其他数据与第 10 列中的数据连接起来,然后将所有这些数据塞入第 10 列。真的有点没用。我意识到发生这种情况是因为第 10 列的分隔符不是像所有其他列一样的制表符,而是 CRLF,所以它只是将所有内容都抓取到 CRLF,并在这样做时用空替换多余的制表符。在我看来,这并不聪明。
  • 如果有人提供一个只有 9 列的文件,情况会更糟。它会暂时忽略意外发现的 CRLF,并用下一行开头的列填充任何缺失的列!不聪明在这里是轻描淡写。谁会希望这种情况发生?文件的其余部分在那时是垃圾。

  • 无论出于何种原因,文件宽度的变化似乎都不是不合理的(当然,只有行尾的变化才能合理地处理(x 少或多列),但看起来这根本没有处理好,除非我我错过了一些东西。

    到目前为止,我们唯一的解决方案是将一行加载为一个巨大的列 (column0),然后使用脚本任务使用它找到的许多分隔符动态拆分它。这很有效,除了它将行宽限制为 4000 个字符(一个 unicode 列的最大宽度)。如果您需要导入更宽的行(比如用于文本导入的多个 4000 宽列),那么您需要像上面一样定义多列,但是您会被要求每行有严格的列数。

    有没有办法绕过这些限制?

    最佳答案

    格伦,我感觉到你的痛苦:)
    SSIS 无法使列动态化,因为它需要存储每列通过时的元数据,并且由于我们正在处理可以包含任何类型数据的平面文件,因此它不能假设 '列中的 CRLF -that-is-not-that-last-column',确实是它应该读取的数据行的末尾。

    与 SQL2000 中的 DTS 不同,您不能在运行时更改 SSIS 包的属性。

    您可以做的是创建一个父包,它读取平面文件(脚本任务),并且只读取平面文件的第一行以获取列数和列名。此信息可以存储在变量中。

    然后,父包以编程方式加载子包(再次脚本任务),并更新子包的Source Connection的元数据。这是你要么
    1. 添加/删除列以匹配平面文件。
    2. 为列设置列分隔符,最后一列必须是 CRLF - 匹配 ROW 分隔符
    3. 在数据流任务中重新初始化源组件的元数据(ComponentMetadata.ReinitializeMetadata())(以识别源连接中最近的变化)。
    4.保存子ssis包。

    有关以编程方式修改包的详细信息仅现成可用。

    然后,您的父包只执行子包(执行包任务),它将使用您的新映射执行。

    关于file - 具有可变列号的 SSIS 平面文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4281237/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com