我写的SSIS包到SQL Server 2008上运行,你怎么做到在SSIS的UPSERT?
IF KEY NOT EXISTS INSERT ELSE IF DATA CHANGED UPDATE ENDIF ENDIF
我写的SSIS包到SQL Server 2008上运行,你怎么做到在SSIS的UPSERT?
IF KEY NOT EXISTS INSERT ELSE IF DATA CHANGED UPDATE ENDIF ENDIF
请参阅SQL Server 2008中-使用合并从SSIS 。 我实现了这样的事情,这是非常容易的。 只是用BOL页面插入,更新和删除数据使用MERGE是足以让我去。
我建议你看看垫斯蒂芬对SQL Server的更新插入博客。
SQL 2005 - UPSERT:在自然界中,但叫不上名字; 但最后!
已经在多年使用的基础数据操纵语言(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”任务,将代码放在那里。
另一种方法来创建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))
除了T-SQL基础的解决方案(这甚至没有标记为SQL / T-SQL ),你可以使用SSIS数据流任务与合并所描述的加入这里 (和其他地方 )。
最关键的部分是完全外部联接的合并加入(如果你只想要插入/更新,而不是删除左外连接工程以及)你整理来源。
随后是条件性拆分知道下一步该怎么做:插入到目标(这也是我在这里源),更新(通过SQL命令),或者从它(再次通过SQL命令)删除。
我通常喜欢让SSIS引擎来管理三角洲合并。 只有新项目插入与变化了的更新。 如果目标服务器没有足够的资源来管理重查询,这种方法允许使用SSIS服务器的资源。
我会用“慢变化维度”任务