我有一个SSIS小问题。我从一个具有可变列列表的MySQL表中提取数据,到一个具有固定列列表的SQL Server表中提取。
源表:测试(mysql-server)
id | name | sal | deptno | loc | referby
1 | abc | 100 |10 | hyd | xyz
2 | mnc | 200 |20 |chen | pqr
首先我选择MySQL表配置,然后拖放用于MySQL服务器表配置的oledbdestination。我配置了目标表,之后包工作正常,数据如下所示。
目标表:测试(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
我总是截断目标表并加载数据。
目标表具有不变的列列表,而源表的列列表可能会有所不同我不想继续编辑查询以解释可能丢失的列如何在包级别处理此问题?
几个想法:
-
使用动态SQL将简单的
SELECT ...
替换为一个查询,该查询遍历目标表的列列表(可能通过SHOW COLUMNS
获取),构建一个为缺失列插入NULL的SELECT
查询,然后通过PREPARE
和EXECUTE
执行它。生成查询的查询需要生成一个
SELECT
语句,该语句包含目标表希望看到的固定列集。如果源中不存在期望的列,则生成查询的查询应在查询中插入占位符NULL AS ColumnName
。(我不是MySQL专家,所以我不确定MySQL在这方面的确切能力,但理论上这种方法听起来可行。)
-
使用脚本组件作为数据源使用所需的输出列配置此组件。让组件查询源数据库(可能使用简单的
SELECT * FROM ....
),然后仅将中存在的相关列从源复制到输出行缓冲区。使用这种方法,不存在的列将自动作为null/其默认值输出到数据流中,因为脚本组件不会将它们设置为值
SSIS在处理这样的动态源时非常严格。我认为您最好的选择是探索BIML,它可以在每次需要"刷新"模式时为您生成一个新的包。
http://www.sqlservercentral.com/stairway/100550/