我正在编写一个在 SQL Server 2008 上运行的 SSIS 包。如何在 SSIS 中执行 UPSERT?
如果键不存在 插入 别的 如果数据更改 更新 万一 万一
我正在编写一个在 SQL Server 2008 上运行的 SSIS 包。如何在 SSIS 中执行 UPSERT?
如果键不存在 插入 别的 如果数据更改 更新 万一 万一
请参阅SQL Server 2008 - 使用来自 SSIS 的合并。我已经实现了类似的东西,而且非常容易。仅使用 BOL 页面Inserting, Updating, and Deleting Data using MERGE就足以让我继续前进。
我建议你看看 Mat Stephen 在 SQL Server 的 upsert 上的博客。
多年来一直在使用的基本数据操作语言 (DML) 命令是更新、插入和删除。它们完全符合您的预期:Insert 添加新记录,Update 修改现有记录,Delete 删除记录。
UPSERT 语句修改现有记录,如果记录不存在,则插入新记录。UPSERT 语句的功能可以通过两组新的 TSQL 运算符来实现。这是两个新的
EXCEPT
INTERSECT
除了:-
返回从查询到操作数左侧的任何不同值,这些值也不是从右侧查询返回的
相交:- 返回由 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 的另一种方法(如果您有 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))
我通常更喜欢让 SSIS 引擎来管理增量合并。只有新项目被插入并被更新。如果您的目标服务器没有足够的资源来管理繁重的查询,则此方法允许使用您的 SSIS 服务器的资源。
我会使用“缓慢变化的维度”任务