0

我有一个小 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 服务器 testsource 配置并编辑查询以为缺少的列返回 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  

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

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

4

2 回答 2

2

几个想法:

  • 使用动态 SQL。SELECT ...用遍历目标表的列列表(可能通过 获取)的查询替换您的直截了当SHOW COLUMNS,构建一个SELECT为缺少的列插入 NULL 的查询,然后通过PREPAREandEXECUTE执行它。

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

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

  • 使用脚本组件作为数据源。使用您期望的输出列配置此组件。让组件查询源数据库(可能使用简单的SELECT * FROM ....),然后仅将源​​中存在的相关列复制到输出行缓冲区。使用这种方法,不存在的列将自动作为 null/它们的默认值输出到数据流中,因为脚本组件不会将它们设置为值。
于 2014-09-16T15:06:46.553 回答
0

当涉及到这样的动态源时,SSIS 非常严格。我认为您最好的选择是探索 BIML,它可以在您每次需要“刷新”模式时为您生成一个新包。

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

于 2014-09-16T14:00:56.150 回答