1

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

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

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

我想我有几个选择:

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

2 回答 2

0

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

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

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

于 2010-11-16T19:51:15.633 回答
0

如果您使用的是 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() 函数指定的完整大小(填充右侧)。

于 2010-11-17T03:40:03.697 回答