请教一个SSIS的错误处理问题

siegebaoniu 2012-03-24 12:07:59
我有张target表,里面id是pk。

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

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

请问一下,这个在SSIS里能够实现吗? 希望大家指点一二。谢谢。
...全文
431 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
北吹 2014-04-01
  • 打赏
  • 举报
回复
引用 9 楼 siegebaoniu 的回复:
[Quote=引用 8 楼 的回复:] ssis里可以选择error时的处理方式,(container有一个绿箭头和红色箭头,红色箭头是发生error的数据流)可以选择将错误的数据成导入另一个表。 然后目标表加一个唯一约束,这样理论上重复的数据会出错。那么理论上重复的数据会通过error处理(红色的箭头)导入你例外设置的表。 没试过,理论而已。。。 [/Quote] 对,我也是这样想的。但实际是所有的数据都会跑到另外设置的表,而不仅仅是重复数据。
这是因为你没设置失败处理的方式,把目标的失败处理设置成 重定向行 就可以了。
PNtifa 2013-05-16
  • 打赏
  • 举报
回复
注: 目标一定要选择 普通加载 不要选择 快速加载,快速加载太快,所以找不准错误数据 换成普通加载 就可以了
PNtifa 2013-05-07
  • 打赏
  • 举报
回复
理论是对的 本人测试过
PNtifa 2012-10-29
  • 打赏
  • 举报
回复
同6楼
用lookup 查找主键
查找到的进 error
没查找到的就进 target
siegebaoniu 2012-04-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
ssis里可以选择error时的处理方式,(container有一个绿箭头和红色箭头,红色箭头是发生error的数据流)可以选择将错误的数据成导入另一个表。
然后目标表加一个唯一约束,这样理论上重复的数据会出错。那么理论上重复的数据会通过error处理(红色的箭头)导入你例外设置的表。

没试过,理论而已。。。
[/Quote]
对,我也是这样想的。但实际是所有的数据都会跑到另外设置的表,而不仅仅是重复数据。
mayuanf 2012-04-02
  • 打赏
  • 举报
回复
ssis里可以选择error时的处理方式,(container有一个绿箭头和红色箭头,红色箭头是发生error的数据流)可以选择将错误的数据成导入另一个表。
然后目标表加一个唯一约束,这样理论上重复的数据会出错。那么理论上重复的数据会通过error处理(红色的箭头)导入你例外设置的表。

没试过,理论而已。。。
siegebaoniu 2012-04-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
在SSIS中有个Look up 转换工具可以帮你解决此问题。
[/Quote]
能说得详细点吗?
gudujianxiao 2012-03-31
  • 打赏
  • 举报
回复
在SSIS中有个Look up 转换工具可以帮你解决此问题。
siegebaoniu 2012-03-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
还是要定义好业务键,任何一组数据都应该从业务上为它定义主键(Source如果是关系型数据,应该有NaturalKey),否则这样的数据进入DW会比较麻烦,也会产生很多分析异常。
另外,
1,如果数据是维度数据可以用Upsert方式(存在更新,不存在插入)
2,如果是fact数据,update操作不现实,fact数据必须有Natual Key,或者是数据的粒度,否则需要重新做业务分析。
[/Quote]
谢谢楼上两位答复,不过我不是来请教业务逻辑的,我只想问怎么用SSIS错误处理来去重复数据。
Warren 2012-03-28
  • 打赏
  • 举报
回复
还是要定义好业务键,任何一组数据都应该从业务上为它定义主键(Source如果是关系型数据,应该有NaturalKey),否则这样的数据进入DW会比较麻烦,也会产生很多分析异常。
另外,
1,如果数据是维度数据可以用Upsert方式(存在更新,不存在插入)
2,如果是fact数据,update操作不现实,fact数据必须有Natual Key,或者是数据的粒度,否则需要重新做业务分析。
BigAzrael 2012-03-25
  • 打赏
  • 举报
回复
一般使用代理键来处理这问题,因为多个数据源如果不改变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),用以记录数据变更的版本号
dawugui 2012-03-24
  • 打赏
  • 举报
回复
建议,先把数据导入到一个表,然后通过这个表和实际的表去比较,把需要的数据导入到最终的表里.

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.关键字)
siegebaoniu 2012-03-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dawugui 的回复:]
建议,先把数据导入到一个表,然后通过这个表和实际的表去比较,把需要的数据导入到最终的表里.

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

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

……
[/Quote]


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

要是在SSIS里没有简单方法实现,那也真没办法。

695

社区成员

发帖
与我相关
我的任务
社区描述
提出问题
其他 技术论坛(原bbs)
社区管理员
  • community_281
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧