在SSIS OLEDB目标中更新行

32

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

Data Flow Task

源从两个分段表中合并数据并返回结果集(假设为50K行)。这50K行数据也存在于目标表中,但是是旧数据。

SELECT * FROM staging1
UNION
SELECT * FROM staging2 

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

属于批量更新。

请问有谁可以告诉我如何做到这一点?感谢您的帮助。

3个回答

46

在SSIS中,你无法使用默认组件在数据流任务中进行批量更新。

一般的模式是识别你的插入、更新和删除操作,并将更新和删除操作推送到一个暂存表中,然后在数据流任务之后,使用基于集合的更新或删除操作在执行SQL任务中进行操作。可以参考Andy Leonard的Stairway to Integration Services series,在文章的大约3/4处查看"基于集合的更新"部分,了解具体的模式。

暂存数据

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

基于集合的更新

enter image description here

使用这种模式与使用“OLE DB Command”转换相比,性能会更好,除非处理的数据量非常小。
如果你使用第三方工具,我相信CozyRoc和PragmaticWorks都有合并目标组件。

2
是的,这就是我在寻找的答案/确认;直截了当的否定:)。很遗憾,不能使用任何第三方工具。 - Rahul
2
@statikuz 我同意,但使用 https://www.guerrillamail.com/ 只需要几秒钟。 - Turch
1
在我看来,sqlservercentral网站值得注册。我也同意@Turch的观点,使用临时电子邮件服务可以保持您的收件箱清洁。或者,您可以在注册后直接取消订阅他们的邮件列表。 - Ryan Kyle
对于任何寻找上述“通往集成服务之路”的链接的人,它已经移动到这里:https://www.sqlservercentral.com/steps/adding-rows-in-incremental-loads-level-3-of-the-stairway-to-integration-services - Alan K
相关的集成服务楼梯链接现在是https://www.sqlservercentral.com/steps/updating-rows-in-incremental-loads-level-4-of-the-stairway-to-integration-services - undefined

22
使用Lookupstage来决定是插入还是更新。 查看此链接以获取更多信息 - http://beingoyen.blogspot.com/2010/03/ssis-how-to-update-instead-of-insert.html 更新步骤:
  1. 拖动OLEDB Command [而不是oledb destination]
  2. 转到属性窗口
  3. 在自定义属性下选择SQLCOMMAND并插入更新命令, 例如:

    UPDATE table1 SET col1 = ?, col2 = ? WHERE id = ?

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


请再读一遍我的问题,我已经知道它必须更新,不需要决定。我只想知道如何批量更新记录。 - Rahul
你读了那篇文章吗?它会告诉你如何生成一个更新行的脚本,以及如何在SSIS中进行更新的概念。 - rs.
Rahul是正确的。该链接文章将为所有50,000行执行单例更新。这将会很慢而且痛苦。他们的愿望是发出一个单个更新语句,以一次性合并数据。 - billinkc
如果需要执行选择和更新操作,可以使用“执行 SQL 任务”,在其中编写脚本或使用存储过程。在数据流选项卡中,没有使用源和目标进行批量更新的选项。数据流任务逐行处理。 - rs.
虽然这不是我寻找的解决方案,但因为提供了替代方案,所以点个赞。 - Rahul
我试图按照RS链接中的数据流重建,但是我在工具箱中找不到UPDATE对象。有人能帮忙找一下吗? - Robert

2

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

update Original 
set Original.Vaal= t.vaal 
from Original join (select * from staging1  union   select * from staging2) t 
on Original.id=t.id

我自己也在考虑这个问题。为什么要费力地选择到一个暂存表,然后再从暂存表更新,当你可以使用脚本任务创建一个单一的SQL语句来选择和更新呢? - mbeckish
如果你的数据源和目标位于不同的服务器上,使用 SSIS 和中间表技术是有优势的。这样做可以将我的同步过程时间从 50 分钟降低到了 2 分钟,效果非常好。 - K0D4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接