UPSERT在SSIS(UPSERT in SSIS)

2019-06-26 01:16发布

我写的SSIS包到SQL Server 2008上运行,你怎么做到在SSIS的UPSERT?

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

Answer 1:

请参阅SQL Server 2008中-使用合并从SSIS 。 我实现了这样的事情,这是非常容易的。 只是用BOL页面插入,更新和删除数据使用MERGE是足以让我去。



Answer 2:

我建议你看看垫斯蒂芬对SQL Server的更新插入博客。

SQL 2005 - UPSERT:在自然界中,但叫不上名字; 但最后!



Answer 3:

已经在多年使用的基础数据操纵语言(DML)命令是更新,插入和删除。 他们这样做你期望什么:插入增加了新的记录,更新修改现有记录和删除删除记录。

UPSERT语句修改现有记录,如果记录不存在,它插入新记录。 UPSERT statment的功能可以由两个组新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”任务,将代码放在那里。



Answer 4:

另一种方法来创建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))


Answer 5:

除了T-SQL基础的解决方案(这甚至没有标记为SQL / T-SQL ),你可以使用SSIS数据流任务与合并所描述的加入这里 (和其他地方 )。

最关键的部分是完全外部联接的合并加入(如果你只想要插入/更新,而不是删除左外连接工程以及)你整理来源。

随后是条件性拆分知道下一步该怎么做:插入到目标(这也是我在这里源),更新(通过SQL命令),或者从它(再次通过SQL命令)删除。

  1. INSERT:如果GID只找到在源(左)
  2. UPDATE如果GID存在于源和目标
  3. 删除:如果源文件未找到的GID,但存在于目标(右)



Answer 6:

我通常喜欢让SSIS引擎来管理三角洲合并。 只有新项目插入与变化了的更新。 如果目标服务器没有足够的资源来管理重查询,这种方法允许使用SSIS服务器的资源。



Answer 7:

我会用“慢变化维度”任务



文章来源: UPSERT in SSIS