代码之家  ›  专栏  ›  技术社区  ›  moribvndvs

SSIS OLE DB数据流源:输出可能具有不同长度的列

  •  1
  • moribvndvs  · 技术社区  · 14 年前

    我创建了一个SSIS包,这样我就可以按计划的时间间隔从旧的FoxPro数据库导入数据。为多个客户安装了FoxPro数据库的副本。总的来说,这个软件包工作得很好,能完成我所需要的一切。

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

    我想我可以给自己一些回旋的空间,把长度从3改为10。这样一来,长度为10的突变体就可以适应,其他所有使用3的突变体也可以适应。但是,当列长度不匹配时,ssis会抱怨period。

    我想我有几个选择:

    1. 在任务上,将“validateexternalmetadata”设置为false。不过,我不确定这是最负责任的选择…还是?
    2. 让我们的实施团队将所有客户的长度改为10。这可能是个问题,但至少是他们的问题。
    3. 创建适用于具有不同列长度的解决方案的任务的副本。实现在某个时候可能会使用错误的包,每个人都会问我为什么我不给他们一个不能处理所有场景的包,并把这归咎于我。
    4. 你可以用其他的方法来填补我的空缺。
    2 回复  |  直到 14 年前
        1
  •  0
  •   DRapp    14 年前

    如果您使用的是VisualFoxPro 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()函数(pad right)将其填充到指定的完整大小。

        2
  •  0
  •   bobs    14 年前

    我在FoxPro方面很弱,但是…

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

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