更新SSIS OLEDB目标中的行

Rah*_*hul 26 ssis sql-server-2008

我有一个数据流程,我有一个OLEDB源和一个OLEDB目的地,如下所示:

数据流任务

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

SELECT * FROM staging1
UNION
SELECT * FROM staging2 
Run Code Online (Sandbox Code Playgroud)

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

一种批量更新.

谁能告诉我怎么做到这一点?我感谢您的帮助.

bil*_*nkc 37

您无法在具有OOB组件的数据流任务中对SSIS进行批量更新.

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

舞台数据

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

设置基于更新

在此输入图像描述

使用这样的模式可以获得更好的性能,而不是使用OLE DB Command转换来获取除了大量数据之外的任何数据.

如果你是第三方工具,我相信CozyRoc和我知道PragmaticWorks有一个合并目标组件.

  • 是的,这是我一直在寻找的答案/确认;一个简单的NO :)。运气不好,不能使用任何第三方工具。 (2认同)
  • @statikuz我同意,但使用https://www.guerrillamail.com/它只需要几秒钟 (2认同)

rs.*_*rs. 18

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

更新步骤:

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

    UPDATE table1 SET col1 = ?, col2 =?其中id =?

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


Rah*_*hul 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
Run Code Online (Sandbox Code Playgroud)