我正在编写一个在SQL Server 2008上运行的SSIS包。你如何在SSIS中进行UPSERT?
IF KEY NOT EXISTS INSERT ELSE IF DATA CHANGED UPDATE ENDIF ENDIF
答案 0 :(得分:10)
见SQL Server 2008 - Using Merge From SSIS。我已经实现了这样的东西,而且非常简单。只需使用BOL页面Inserting, Updating, and Deleting Data using MERGE就足以让我继续前进。
答案 1 :(得分:3)
我建议你看一下Mat Stephen关于SQL Server upsert的博客。
答案 2 :(得分:2)
多年来一直在使用的基本数据操作语言(DML)命令是Update,Insert和Delete。它们完全符合您的期望:Insert添加新记录,Update修改现有记录,Delete删除记录。
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,2,5,因为它们存在于Table_1和Table_2两个表中。
现在消除了复杂连接的所有痛苦:-)
要在SSIS中使用此功能,您只需添加“执行SQL”任务并将代码放入其中。
答案 3 :(得分:1)
在sql中创建upsert的另一种方法(如果你有pre-stage或stage表):
--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))
答案 4 :(得分:0)
除了基于T-SQL的解决方案(甚至都没有标记为sql / tsql)之外,您还可以按here所述将SSIS数据流任务与合并联接一起使用(和elsewhere)。
至关重要的部分是已排序源中的合并联接中的完全外部联接(如果您只想插入/更新而不是删除左外部联接也可以)。
之后是条件拆分,以了解下一步该怎么做:插入目标位置(这也是我的源代码),对其进行更新(通过SQL Command)或从中删除(再次通过SQL Command)。
答案 5 :(得分:0)
答案 6 :(得分:-1)
我通常更喜欢让SSIS引擎来管理delta合并。仅插入和更改新项目。 如果目标服务器没有足够的资源来管理繁重的查询,则此方法允许使用SSIS服务器的资源。
答案 7 :(得分:-1)
我会使用'缓慢变化的维度'任务