2010-11-16 72 views
1

我创建了一个SSIS包,以便我可以按计划的时间间隔从旧版FoxPro数据库导入数据。为几个客户安装了FoxPro数据库的副本。总的来说,这个软件包工作得很好,完成了我所需要的一切。SSIS OLE DB数据流来源:输出可能有不同长度的列

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

我以为我可以给自己一些摆动的空间,并将长度从3改为10.这样,长度为10的突变体将被容纳,以及其他所有使用3的突变体。然而,当SSIS列长度​​不匹配,句点。

我想我有几个选择:

  1. 在任务设置“ValidateExternalMetadata”为假。但是,我不确定这是最负责任的选择......还是它?
  2. 让我们的执行团队将所有客户的长度更改为10。这可能是一个问题,但至少这是他们的问题。
  3. 创建适用于具有不同列长度的解决方案的任务副本。实施可能会在某个时候使用错误的软件包,每个人都会问我为什么不给他们一个单一的软件包,无法处理所有情况,并将此归咎于我。
  4. 使用一些其他的方法,你可能会填补我的空白。

回答

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()函数指定的完整大小(填充板右侧)。

+0

我结束了使用CAST(我试图错误地尝试CONVERT早期的SSIS有一个限制,你不能使用计算列作为数据源,实际上我的意思是OLE DB/ANSI 92等效CAST ),但我认为它与你所建议的基本相似。谢谢。 – HackedByChinese 2010-11-17 16:33:47

0

我在FoxPro的侧弱,但是......

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

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