UPSIS在SSIS

时间:2009-07-15 15:19:53

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

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

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

8 个答案:

答案 0 :(得分:10)

SQL Server 2008 - Using Merge From SSIS。我已经实现了这样的东西,而且非常简单。只需使用BOL页面Inserting, Updating, and Deleting Data using MERGE就足以让我继续前进。

答案 1 :(得分:3)

我建议你看一下Mat Stephen关于SQL Server upsert的博客。

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

答案 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的解决方案(甚至都没有标记为 / )之外,您还可以按here所述将SSIS数据流任务与合并联接一起使用(和elsewhere)。

enter image description here

至关重要的部分是已排序源中的合并联接中的完全外部联接(如果您只想插入/更新而不是删除左外部联接也可以)。

enter image description here

之后是条件拆分,以了解下一步该怎么做:插入目标位置(这也是我的源代码),对其进行更新(通过SQL Command)或从中删除(再次通过SQL Command)。

  1. INSERT:如果仅在源(左)上找到gid
  2. 更新如果源和目标同时存在该gid
  3. 删除:如果未在源中找到gid,但在目标中存在该gid(右)

enter image description here

答案 5 :(得分:0)

答案 6 :(得分:-1)

我通常更喜欢让SSIS引擎来管理delta合并。仅插入和更改新项目。 如果目标服务器没有足够的资源来管理繁重的查询,则此方法允许使用SSIS服务器的资源。

答案 7 :(得分:-1)

我会使用'缓慢变化的维度'任务