none
请教SSIS问题 RRS feed

  • 问题

  • 刚开始接触sql server 2005的SSIS,请教一个问题:

    我需要从一个源数据库向目标数据库导数据,在控制流中添加了数据流任务,在此任务中,又添加了数据流源、数据流目标,分别设置好,并添加了映射,执行后,数据导入成功,但是在第二次执行时,因为目标数据库已经有了上次导入的数据,因此不能插入重复的键,导致导入失败,从而影响了控制流中,后续的数据流任务。

    请教各位,在进行此类操作时,应该怎么处理呢?

    2010年7月15日 4:38

答案

  • 批量导入的时候做唯一检查比较麻烦

    一般做法是:

    1.先把数据导入到一个中间表,这里不检查重复。

    2.中间表排重后插入目标表内。

    3.删除中间表数据。

     


    family as water
    2010年7月15日 5:58
  • 你好,

    不太确定你的问题。从你的描述来看,是不是每次数据迁移过程中将历史数据一起重新做一次导入的? 如果是这样的话,您的目的表之前需要加一步DATA CLEAN的过程,清除掉之前的数据;

    如果你的意思是不清理目标表数据,而在迁移过程中判断新插入记录是否在目的表中存在,存在的则不导入,不存在的则导入。那在SSIS中可以使用这样的方法,创建2个SourceControl,一个连接数据来源,另一个连接目的表。两个SC之间使用一个左外连方式的JOIN关联起来,关联结果为NULL的即为需要插入的数据。

    Thanks.


    Microsoft Online Community Support Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    2010年7月16日 7:14
    版主

全部回复

  • 批量导入的时候做唯一检查比较麻烦

    一般做法是:

    1.先把数据导入到一个中间表,这里不检查重复。

    2.中间表排重后插入目标表内。

    3.删除中间表数据。

     


    family as water
    2010年7月15日 5:58
  • 你好,

    不太确定你的问题。从你的描述来看,是不是每次数据迁移过程中将历史数据一起重新做一次导入的? 如果是这样的话,您的目的表之前需要加一步DATA CLEAN的过程,清除掉之前的数据;

    如果你的意思是不清理目标表数据,而在迁移过程中判断新插入记录是否在目的表中存在,存在的则不导入,不存在的则导入。那在SSIS中可以使用这样的方法,创建2个SourceControl,一个连接数据来源,另一个连接目的表。两个SC之间使用一个左外连方式的JOIN关联起来,关联结果为NULL的即为需要插入的数据。

    Thanks.


    Microsoft Online Community Support Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    2010年7月16日 7:14
    版主
  • 在SSIS 中向目标表导入数据的操作都是 Insert 或 Bulk Insert。SSIS 最适合导入新数据,Update 的操作比较麻烦,根据你的数据量大小可以选择不同的方案。

    • 如果不考虑性能的话,可以使用 OLE DB Command 组件,在这个组件中可以使用带条件的 Update 语句;
    • 如果性能要求很高,可以使用 Lookup 组件找出目标表中不存在的记录再插入;
    • 如果目标表很大,Lookup 就会很慢,这个时候可以考虑使用第三放组件来实现;
    • 如果第三方组件也满足不了要求,可以考虑放弃使用数据流任务而直接使用 Execute SQL 任务 - 如果数据源是 SQL Server;
    • 如果数据源不支持SQL, 对性能要求很高,数据目标很大,可以考虑使用 Script Components 自己开发 Transformation...
    • 如果以上都行不通,可以在数据源中做处理标志...

     

     

    2010年7月19日 1:31
    版主
  • 最简单的做法是导入之前清空目的表, 然后重新导入所有数据.

    如果你要增量导入, 那么必须自己去实现如何增量的处理方法, SSIS 不提高这样的功能.

    2010年7月19日 4:32