日期:2014-05-17  浏览次数:20500 次

请教一个SSIS的错误处理问题
我有张target表,里面id是pk。

我的query从source将数据导入target里。但不能保证id是唯一的,于是我加了一个错误输出error表在target上。
现在一旦有id重复的错误,这一次数据就会全部导入进我的error表。这样error里有全部记录,但target表里0条。

我理想状态是,query往target里导数据,若一旦有一条重复的数据,那就进入error表。
这样下来,相当于做了个过滤。一次ETL后,target里有正常的数据,而error表里有那些重复的数据。

请问一下,这个在SSIS里能够实现吗? 希望大家指点一二。谢谢。
------解决方案--------------------
建议,先把数据导入到一个表,然后通过这个表和实际的表去比较,把需要的数据导入到最终的表里.

insert into tb1(列出所有字段1) select 列出所有字段2 from tb2 where not exists(select 1 from tb1 where tb1.关键字 = tb2.关键字)

如果列出所有字段1在顺序,类型上和列出所有字段2一模一样,可简写为如下:

insert into tb1 select * from tb2 where not exists(select 1 from tb1 where tb1.关键字 = tb2.关键字)

------解决方案--------------------
引用:
建议,先把数据导入到一个表,然后通过这个表和实际的表去比较,把需要的数据导入到最终的表里.

insert into tb1(列出所有字段1) select 列出所有字段2 from tb2 where not exists(select 1 from tb1 where tb1.关键字 = tb2.关键字)

如果列出所有字段1在顺序,类型上和列出所有字段2一模一样,可简写为如下:

……



因为这种ETL有很多很多,然后出错的概率也是非常非常小的。
如果还要加表的话,对性能肯定有比较大的影响。
实在不行的话,就只能将那一次的所有数据都导入error表里了。
空跑一次target的话,担心一些增量相关的log信息会不会白白更新。

要是在SSIS里没有简单方法实现,那也真没办法。
------解决方案--------------------
一般使用代理键来处理这问题,因为多个数据源如果不改变ID很难保证ID不重复
代理键添加方法,例如:
Source_Table   Object_Table
id(pk)         id(PK)
Filed_a        Filed_a
Filed_b        Filed_b
               Su_key
Object_Table.id一般使用序列,就是从1开始的数值
Object_Table.Su_key = Source_Table.id
Object_Table.Su_key存储Source_Table.id,做增量数据插入时用Souce_table.id 与 Object.su_key的值判断数据是否存在,至于Source_Table中已有数据变更可后在Object_table要可查询数据变更历史的话可以加入Version(Number),用以记录数据变更的版本号
------解决方案--------------------
还是要定义好业务键,任何一组数据都应该从业务上为它定义主键(Source如果是关系型数据,应该有NaturalKey),否则这样的数据进入DW会比较麻烦,也会产生很多分析异常。
另外,
1,如果数据是维度数据可以用Upsert方式(存在更新,不存在插入)
2,如果是fact数据,update操作不现实,fact数据必须有Natual Key,或者是数据的粒度,否则需要重新做业务分析。
------解决方案--------------------
引用:
还是要定义好业务键,任何一组数据都应该从业务上为它定义主键(Source如果是关系型数据,应该有NaturalKey),否则这样的数据进入DW会比较麻烦,也会产生很多分析异常。
另外,
1,如果数据是维度数据可以用Upsert方式(存在更新,不存在插入)
2,如果是fact数据,update操作不现实,fact数据必须有Natual Key,或者是数据的粒度,否则需要重新做业务分析。

谢谢楼上两位答复,不过我不是来请教业务逻辑的,我只想问怎么用SSIS错误处理来去重复数据。
------解决方案--------------------
在SSIS中有个Look up 转换工具可以帮你解决此问题。
------解决方案--------------------
引用:
在SSIS中有个Look up 转换工具可以帮你解决此问题。

能说得详细点吗?
------解决方案--------------------
ssis里可以选择error时的处理方式,(container有一个绿箭头和红色箭头,红色箭头是发生error的数据流)可以选择将错误的数据成导入另一个表。
然后目标表加一个唯一约束,这样理论上重复的数据会出错。那么理论上重复的数据会通过error处理(红色的箭头)导入你例外设置的表。

没试过,理论而已。。。
------解决方案--------------------
引用:
ssis里可以选择error时的处理方式,(container有一个绿箭头和红色箭头,红色箭头是发生error的数据流)可以选择将错误的数据成导入另一个表。