如何在不匹配时实现合并然后在SSIS数据流任务中插入?

时间:2016-02-01 18:18:16

标签: sql-server sql-server-2008 tsql ssis

我遇到了从staging加载到Dimension表的情况。加载到目标表时,只需插入新行而不是现有行。 以下是我的查询蓝图。出于某些原因,我首先插入临时表,然后从临时表到目标表。

    IF  OBJECT_ID('tempdb..#Temp_Table') IS NOT NULL
    DROP TABLE  #Temp_Table;
    CREATE TABLE #Temp_Table(col1 smallint identity(2,1),
                     col2 varchar(100),
                     col3 varchar(100)
                    )
    Insert into #Temp_Table( col2 ,
                             col3 
                            )
            SELECT DISTINCT Col2,
                            Col3
                     From Staging_Table
             left outer join Dimension_Table --to exclude already existing records


   INSERT INTO Dimension_Table(Col1,col2,col3)
           SELECT Col1, Col2, COl3
                 FROM #Temp_Table

到目前为止,查询工作正常。但是,Dimension_Table中的Col1是主键。因此,在插入时,即使该行已存在于Dimension_Table中,该行也会被插入,因为我在temp_table中生成了新的col1(identity)值。 更清楚的是,如果登台表数据与昨天相同...通过生成新的PrimaryKey值来插入行。我想到了实施以下步骤

  1. 比较登台和维度数据 合并......当NotMatched ....然后插入Temp_Table

  2. 为临时表中的现有数据生成标识列值(通过创建新列)

  3. 从Temp_Table插入到Dimension_Table
  4. 有人可以帮我解决如何使用ssis ???

    来实现这一点

1 个答案:

答案 0 :(得分:1)

您可以执行更新选择以使用目标表中的ID填充临时表。查询可能看起来像这样:

UPDATE tempTable
SET tempTable.col1 = destination.col1
FROM #Temp_Table tempTable 
INNER JOIN Dimension_Table destination 
ON tempTable.col2 = destination.col2 AND tempTable.col3 = destination.col3

当然,要执行此操作,您必须删除临时表中要插入的column1上的标识规范。接下来,您需要做的就是在temptable中选择col1为null的所有行。

对于SSIS实现,有一个名为“LookUp”的任务。您可以选择要查找的列,SSIS将为您提供两种不同的输出。一行与查找匹配,另一行与查找不匹配。从那里,您可以执行每个解决方案集所需的操作。