我遇到了从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值来插入行。我想到了实施以下步骤
比较登台和维度数据 合并......当NotMatched ....然后插入Temp_Table
为临时表中的现有数据生成标识列值(通过创建新列)
有人可以帮我解决如何使用ssis ???
来实现这一点答案 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将为您提供两种不同的输出。一行与查找匹配,另一行与查找不匹配。从那里,您可以执行每个解决方案集所需的操作。