6

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

如果键不存在
  插入
别的
  如果数据更改
    更新
  万一
万一
4

8 回答 8

12

请参阅SQL Server 2008 - 使用来自 SSIS 的合并。我已经实现了类似的东西,而且非常容易。仅使用 BOL 页面Inserting, Updating, and Deleting Data using MERGE就足以让我继续前进。

于 2009-07-15T23:39:59.200 回答
6

除了基于 T-SQL 的解决方案(甚至没有标记为 / ),您可以使用带有合并连接的 SSIS 数据流任务,如此(和其他地方)所述。

在此处输入图像描述

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

在此处输入图像描述

然后是条件拆分以知道下一步该做什么:插入目标(这也是我的源),更新它(通过 SQL 命令),或从中删除(再次通过 SQL 命令)。

  1. INSERT:如果仅在源中找到 gid(左)
  2. 更新如果源和目标上都存在gid
  3. DELETE:如果在源中找不到gid但在目标中存在(右)

在此处输入图像描述

于 2019-05-14T18:21:53.403 回答
3

我建议你看看 Mat Stephen 在 SQL Server 的 upsert 上的博客。

SQL 2005 - UPSERT:本质上但不是名称;但最后!

于 2009-07-15T15:27:02.190 回答
2

多年来一直在使用的基本数据操作语言 (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”任务并将代码放入其中。

于 2009-07-15T23:25:41.930 回答
2

在 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))
于 2011-08-26T19:36:09.743 回答
0

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

于 2011-12-08T13:21:16.977 回答
0
  1. 我们可以在 SSIS 中使用渐变维度组件来进行 upsert。

https://docs.microsoft.com/en-us/sql/integration-services/data-flow/transformations/configure-outputs-using-the-slowly-changeing-dimension-wizard?view=sql-server-ver15

于 2020-04-23T04:18:04.647 回答
-1

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

于 2012-04-23T11:16:10.690 回答