2009-07-15 60 views
4

我正在编写一个SSIS包在SQL Server 2008上运行。您如何在SSIS中执行UPSERT?SSIS中的UPSERT

 
IF KEY NOT EXISTS 
    INSERT 
ELSE 
    IF DATA CHANGED 
    UPDATE 
    ENDIF 
ENDIF 

回答

3

我建议你看看Mat Stephen在SQL Server的upsert上的博客。

SQL 2005 - UPSERT: In nature but not by name; but at last!

+0

Tx。 T-SQL命令是否存在SSIS等价物?步行将是非常有用的。 (noob) – 2009-07-15 15:30:52

+4

链接似乎已停用。尝试http://blogs.technet.com/mat_stephen/archive/2005/08/31/410022.aspx – Rydell 2009-10-19 21:41:46

1

已经在多年使用的基础数据操纵语言(DML)命令是更新,插入和删除。它们完全符合您的期望:插入添加新记录,更新修改现有记录,删除删除记录。

UPSERT语句修改现有记录,如果记录不存在它插入新记录。 UPSERT语句的功能可以由两套新的TSQL操作符来实现。这是两个新的

EXCEPT 
INTERSECT 

除外: -

返回从查询到的左侧EXCEPT操作数是不是也从右边的查询返回的不同值

相交: - 返回INTERSECT操作数左侧和右侧的查询返回的任何不同的值。

实施例: - 假设我们有两个表表1和表2

Table_1 column name(Number, datatype int) 
---------- 

1 
2 

3 
4 
5 

Table_2 column name(Number, datatype int) 
---------- 

1 
2 

5 

SELECT * FROM TABLE_1 EXCEPT SELECT * FROM TABLE_2 

将返回3,4,因为它存在于TABLE_1不TABLE_2

SELECT * FROM TABLE_1 INTERSECT SELECT * FROM TABLE_2 

返回1,因为它们出现在表格1和表格2中。

所有复杂的痛苦联接现在淘汰:-)

要在SSIS使用此功能,所有你需要做的添加一个“执行SQL”任务,将代码放在那里。

0

另一种方法来创建SQL的UPSERT(如果有前级或级表):

--Insert Portion 
INSERT INTO FinalTable 
(Colums) 
SELECT T.TempColumns 
FROM TempTable T 
WHERE 
(
    SELECT 'Bam' 
    FROM FinalTable F 
    WHERE F.Key(s) = T.Key(s) 
) IS NULL 

--Update Portion 
UPDATE FinalTable 
SET NonKeyColumn(s) = T.TempNonKeyColumn(s) 
FROM TempTable T 
WHERE FinalTable.Key(s) = T.Key(s) 
    AND CHECKSUM(FinalTable.NonKeyColumn(s)) <> CHECKSUM(T.NonKeyColumn(s)) 
+0

这是在SQL 2005中执行此操作的好方法,但请不要忘记可选第3节用于删除数据。但是,SQL Server 2008具有相似功能的MERGE语句,并且速度可能更快。 – Korey 2011-10-27 19:14:00

-1

我通常喜欢让SSIS引擎来管理三角洲合并。只有新项目被插入并且更新被更新。 如果您的目标服务器没有足够的资源来管理大量查询,则此方法允许使用您的SSIS服务器的资源。

-1

我会使用“缓慢变化尺寸”任务