在ssis中处理动态缺少的源列

时间:2014-09-16 08:34:26

标签: ssis ssis-2012

我有一个小的SSIS问题。我正在从具有不同列列表的MySQL表中将数据提取到具有固定列列表的SQL Server表。

源表:测试(mysql服务器)

 id  |     name   |    sal      | deptno | loc     |   referby
 1   |      abc   |     100     |10      | hyd     |    xyz
 2   |      mnc   |     200     |20      |chen     |    pqr   

首先我选择MySQL表配置,然后我拖放oledbdestination用于MySQL服务器表配置。我配置目标表,然后包工作正常,数据如下所示。

目标表:测试(sql server)

id   |     name   |     sal     |deptno        | loc           |referby
 1   |      abc   |     100     |10            | hyd           |    xyz
 2   |      mnc   |     200     |20            |chen           |    pqr  

第二次运行包时,已从源表的模式中删除了一列,因此包失败。我打开MySql服务器的测试源配置,编辑查询,为缺少的列返回NULL:

 select id,'null' as name,sal,deptno,loc,referby from test

我重新运行包,数据看起来像这样。

目标表:测试(sql server)

id   |     name   |     sal     |deptno        | loc           |referby
 1   |      null  |     100     |10            | hyd           |    xyz
 2   |      null  |     200     |20            |chen           |    pqr  

我总是截断目标表并加载数据。

目标表具有不变的列列表,而源表的列列表可以变化。 我不想继续编辑查询以考虑可能缺少的列。我如何在包级别处理此问题?

2 个答案:

答案 0 :(得分:2)

一些想法:

  • 使用动态SQL。将简单的SELECT ...替换为遍历目标表列列表的查询(可能通过SHOW COLUMNS获取),构建一个{ {1}}查询为缺少的列插入NULL,然后通过PREPARE and EXECUTE执行。

    生成查询的查询需要生成一个SELECT语句,其中包含目标表期望看到的固定列集。如果源中不存在预期列,则查询生成查询应在查询中插入占位符SELECT

    (我不是MySQL专家所以我不确定MySQL在这方面的确切能力,但理论上这种方法听起来可行。)

  • 使用脚本组件作为数据源。使用您期望的输出列配置此组件。让组件查询源数据库(可能使用简单的NULL AS ColumnName),然后仅将存在的相关从源缓冲区复制到输出行缓冲区。使用此方法,不存在的列将自动作为null /其默认值输出到数据流中,因为Script Component不会将它们设置为值。

答案 1 :(得分:0)

对于像这样的动态来源,SSIS非常严格。我认为你最好的选择是探索BIML,它可以在你每次需要“刷新”架构时为你生成一个新包。

http://www.sqlservercentral.com/stairway/100550/