【问题标题】:Update Rows in SSIS OLEDB Destination更新 SSIS OLEDB 目标中的行
【发布时间】:2012-05-11 17:14:30
【问题描述】:

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

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

SELECT * FROM staging1
UNION
SELECT * FROM staging2 

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

一种批量更新。

谁能告诉我我该怎么做?感谢您的帮助。

【问题讨论】:

    标签: sql-server-2008 ssis


    【解决方案1】:

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

    一般模式是识别您的插入、更新和删除,并将更新和删除推送到临时表,并在数据流任务之后,在执行 SQL 任务中使用基于集合的更新或删除。看看安迪伦纳德的Stairway to Integration Services series。将文章向下滚动约 3/4 至“基于集合的更新”以查看模式。

    舞台数据

    基于集合的更新

    与使用OLE DB Command 转换相比,使用这种模式可以获得更好的性能,而不是处理微不足道的数据。

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

    【讨论】:

    • 是的,这就是我正在寻找的答案/确认;一个直截了当的 NO :)。运气不好,不能使用任何第三方工具。
    • @statikuz 我同意,但guerrillamail.com 只需要几秒钟
    • sqlservercentral 值得注册,恕我直言。我也同意@Turch 关于使用临时电子邮件服务的观点。保持收件箱清洁。或者,您可以在注册后简单地从他们的电子邮件列表中退订。
    • 对于寻找上述集成服务阶梯链接的任何人,它已移至此处:sqlservercentral.com/steps/…
    【解决方案2】:

    使用 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. 按照更新命令中从源到输出的确切顺序映射列

    【讨论】:

    • rs,再次阅读我的问题;我已经知道它必须更新,无需决定。只是想知道,我该如何更新批量 rocords。
    • 你读过那篇文章吗?它将讲述如何生成脚本来更新行以及如何在 SSIS 中更新的概念
    • 拉胡尔是正确的。链接的文章将对所有 50k 行执行单例更新。这将是缓慢而痛苦的。他们希望发布一个更新语句,一举合并数据。
    • 那么这可以使用“执行 sql 任务”来完成,他可以编写脚本来选择和更新或使用存储过程,在数据流选项卡中没有使用源和目标进行批量更新的选项。数据流任务逐行处理
    • 虽然这不是我不想要的解决方案,但 +1 以提供替代方案。
    【解决方案3】:

    好吧,找到了解决我问题的方法;在 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
    

    【讨论】:

    • 我自己也是这么想的。当您可以只使用脚本任务创建一个选择和更新的 SQL 语句时,为什么还要经历选择临时表然后从临时表更新的麻烦?
    • 如果您的数据源和目标位于不同的服务器上,则 SSIS 和中间表技术是有好处的。这样做使我的同步过程从 50 分钟缩短到 2 分钟,这非常棒。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    相关资源
    最近更新 更多