我正在编写一个SSIS包在SQL Server 2008上运行。您如何在SSIS中执行UPSERT?SSIS中的UPSERT
IF KEY NOT EXISTS INSERT ELSE IF DATA CHANGED UPDATE ENDIF ENDIF
我正在编写一个SSIS包在SQL Server 2008上运行。您如何在SSIS中执行UPSERT?SSIS中的UPSERT
IF KEY NOT EXISTS INSERT ELSE IF DATA CHANGED UPDATE ENDIF ENDIF
我建议你看看Mat Stephen在SQL Server的upsert上的博客。
已经在多年使用的基础数据操纵语言(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”任务,将代码放在那里。
参见SQL Server 2008 - Using Merge From SSIS。我已经实现了这样的事情,而且非常简单。只需使用BOL页面Inserting, Updating, and Deleting Data using MERGE就足以让我走了。
我确认,MERGE是要走的路。在这里阅读Kimball:http://www.kimballgroup。com/html/08dt/KU107_UsingSQL_MERGESlowlyChangingDimension.pdf – 2011-10-27 19:06:41
kimballgroup链接已死亡。 – Kyle 2012-10-01 15:39:00
另一种方法来创建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))
这是在SQL 2005中执行此操作的好方法,但请不要忘记可选第3节用于删除数据。但是,SQL Server 2008具有相似功能的MERGE语句,并且速度可能更快。 – Korey 2011-10-27 19:14:00
我通常喜欢让SSIS引擎来管理三角洲合并。只有新项目被插入并且更新被更新。 如果您的目标服务器没有足够的资源来管理大量查询,则此方法允许使用您的SSIS服务器的资源。
我会使用“缓慢变化尺寸”任务
Tx。 T-SQL命令是否存在SSIS等价物?步行将是非常有用的。 (noob) – 2009-07-15 15:30:52
链接似乎已停用。尝试http://blogs.technet.com/mat_stephen/archive/2005/08/31/410022.aspx – Rydell 2009-10-19 21:41:46