【问题标题】:SSIS OLE DB Data Flow Source: outputting a column that may have different lengthsSSIS OLE DB数据流源:输出可能具有不同长度的列
【发布时间】:2010-11-16 19:38:53
【问题描述】:

我创建了一个 SSIS 包,以便可以按计划的时间间隔从旧版 FoxPro 数据库导入数据。 FoxPro 数据库的副本为多个客户安装。总体而言,该软件包运行良好,可以满足我的所有需求。

但是,我遇到了一种烦人的情况,即至少有一个客户(也许更多)有一个修改过的 FP 数据库,他们增加了一张表中一列的长度。当我在这样的客户上运行包时,由于截断而失败。

我想我可以给自己一些回旋余地,将长度从 3 更改为 10。这样,长度为 10 的突变体以及使用 3 的其他所有人都会被容纳。但是,当该列出现时,SSIS 会抱怨长度不匹配,句号。

我想我有几个选择:

  1. 在任务上,将“ValidateExternalMetadata”设置为 false。但是,我不确定这是最负责任的选择……还是这样?
  2. 让我们的实施团队将所有客户的长度更改为 10。这可能是个问题,但至少是他们的问题。
  3. 创建适用于具有不同列长度的解决方案的任务副本。实施时可能会使用错误的包,每个人都会问我为什么我不只给他们一个无法处理所有场景的包并将这归咎于我。
  4. 使用其他一些您可能会填写的方法。

【问题讨论】:

    标签: ssis oledb foxpro dataflow truncation


    【解决方案1】:

    如果您使用 Visual FoxPro OleDB,并且您关心列宽,您可以在调用期间使用 PADR() 显式强制它们。我不知道这会影响多少表/查询,但可以保证您获得预期的字符列长度。如果处理数字、十进制、日期/时间、逻辑(布尔),应该不是问题......无论如何,你可以这样做作为你的选择来获取数据

    select 
          t1.Fld1,
          t1.Fld2,
          padr( t1.CharFld3, 20 ) CharFld3,
          padr( t1.CharFld4, 5 ) CharFld4,
          t1.OtherFld5,
          padr( t1.CharFld6, 35 ) CharFld5
       from
          YourTable t1
       where
          SomeCondition
    

    这将强制基于字符(隐含示例)字段“CharFld3”、“CharFld4”、“CharFld6”的强制宽度分别为 20、5 和 35,而不管底层结构长度如何。现在,如果有人更新结构比你拥有的更长,它将被截断到适当的长度,但不会崩溃。此外,如果它们的列长度较短,它将被填充到您通过 PADR() 函数指定的完整大小(填充右侧)。

    【讨论】:

    • 我最终使用了 CAST(我在早期尝试 CONVERT 时误认为 SSIS 有一个限制,即您不能将计算列用作数据源,而实际上我的意思是 OLE DB /ANSI 92 等效 CAST),但我认为它与您的建议基本相似。谢谢。
    【解决方案2】:

    我在 FoxPro 方面很弱,但是...

    您可以创建一个满足 SSIS 期望的临时表。创建将使用 FoxPro 指令将数据从问题表复制到临时表的任务。更改您的数据流以使用临时表。

    您可以将初步步骤(创建临时表并传输到临时表)创建为 SSIS 任务,以便由您的 SSIS 包管理流控制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-11
      • 2012-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-16
      相关资源
      最近更新 更多