我有一个小的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
我总是截断目标表并加载数据。
目标表具有不变的列列表,而源表的列列表可以变化。 我不想继续编辑查询以考虑可能缺少的列。我如何在包级别处理此问题?
答案 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,它可以在你每次需要“刷新”架构时为你生成一个新包。