31

我有一个数据流过程,其中有一个 OLEDB 源和一个 OLEDB 目标,如下所示:

数据流任务

Source 合并来自两个临时表的数据并返回一个结果集(例如,50K 行)。这 50K 行也存在于目标表中,但都是旧数据。

SELECT * FROM staging1
UNION
SELECT * FROM staging2 

通常,在 OLEDB 目标中,我们将返回的数据集从源表插入到目标表,但在我的情况下,我必须用这些新的 50K 行更新旧的 50K 行。

一种批量更新。

谁能让我知道我该怎么做?我感谢您的帮助。

4

3 回答 3

43

您不能在 SSIS 中使用 OOB 组件在数据流任务中进行批量更新。

一般模式是识别您的插入、更新和删除,并将更新和删除推送到临时表,在数据流任务之后,在执行 SQL 任务中使用基于集合的更新或删除。查看 Andy Leonard 的集成服务阶梯系列。将文章向下滚动 3/4 至“基于集合的更新”以查看模式。

舞台数据

http://www.sqlservercentral.com/Images/11369.png

基于集的更新

在此处输入图像描述

使用这样的模式,您将获得更好的性能,而不是使用OLE DB Command转换来处理微不足道的数据。

如果您喜欢第三方工具,我相信 CozyRoc 和我都知道 PragmaticWorks 有一个合并目标组件。

于 2012-05-11T19:33:20.190 回答
22

使用 Lookupstage 决定是插入还是更新。检查此链接以获取更多信息 - http://beingoyen.blogspot.com/2010/03/ssis-how-to-update-instead-of-insert.html

更新步骤:

  1. 拖动 OLEDB 命令 [而不是 OLEDB 目的地]
  2. 转到属性窗口
  3. 在自定义属性下选择 SQLCOMMAND 并插入更新命令 ex:

    更新表 1 SET col1 = ?, col2 = ? 哪里 id = ?

  4. 按照更新命令中从源到输出的确切顺序映射列

于 2012-05-11T17:19:16.077 回答
2

好吧,找到了解决我的问题的方法;在 SSIS 中使用 SQL 查询和 SQL 任务更新所有行,如下所示。如果他们将来面临同样的挑战,可以帮助他人。

update Original 
set Original.Vaal= t.vaal 
from Original join (select * from staging1  union   select * from staging2) t 
on Original.id=t.id
于 2012-05-13T20:48:19.960 回答