AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 321575
Accepted
Cody K
Cody K
Asked: 2022-12-31 06:55:56 +0800 CST2022-12-31 06:55:56 +0800 CST 2022-12-31 06:55:56 +0800 CST

SSIS OLE DB 目标替换而不是插入

  • 772

正在插入从 OLE DB 源流向 OLE DB 目标的信息,允许在包运行后提交重复记录。

有没有一种好的方法可以替换这些记录而不是插入它们来避免重复?

如果有帮助,我正在使用 Visual Studio 编辑包。

ssis
  • 1 1 个回答
  • 11 Views

1 个回答

  • Voted
  1. Best Answer
    billinkc
    2022-12-31T07:54:54+08:002022-12-31T07:54:54+08:00

    您正在寻找的是如何实现更新插入(插入/更新)模式。

    当您向包含现有数据的表中添加数据时,您需要考虑 3 个条件:

    1. 这张唱片是全新的
    2. 该记录存在且不同
    3. 该记录存在但完全相同

    Andy Leonard 有一个很棒的系列,The Stairway to Integration Services 但第 3 步和第 4 步可能正是您要找的

    https://www.sqlservercentral.com/steps/adding-rows-in-incremental-loads-level-3-of-the-stairway-to-integration-services

    OLE DB 目标组件仅处理插入,因此更新(或用您的术语替换)不是一个选项。

    这给您留下了两个选择:OLE DB 命令或另一个 OLE DB 目标。

    OLE DB 命令允许您为发送的每一行运行任意命令。它会针对发送的每一行执行,如果您有大量行,可能会对性能产生影响。

    更好的选择是第二个 OLE DB 目标。将所有需要更新的现有行(案例 2)填充到“暂存更改表”中。

    在数据流之后,您将添加一个 Execute SQL Task,它对 case 2 的所有行执行数据的批量更新。

    UPDATE T
    SET Col1 = S.Col1 /*etc*/
    FROM dbo.Target AS T
    INNER JOIN dbo.Source as S
    ON S.SurrogateKey = T.SurrogateKey;
    

    在我看来你的包裹看起来像

                            OLE DB Source
                                 |
                            Lookup PK Target
                                 |
                   _____exists_______not exists____
                   |                            |
             Lookup cols Target           OLE DB Dest (Case 1)
                   |
     __________________not exists____
                          |
                     OLE DB Dest (Case 2)
    

    第一次查找是使用键测试是否存在。我们找不到的是 New Row。我们确实找到了什么,然后我们将再次查找,这次匹配我们关心的所有列(即插入日期可能只在数据库中,因此我们不关心它)。如果我们在第二次查找后仍然匹配,那么这些行存在并且相同,情况 3,所以我们什么都不做。更新是在第一次查找中存在但在第二次查找中不存在的行。

    我们可以做很多优化来简化这个,但对于菜鸟来说,这可能是最容易掌握的。

    • 0

相关问题

  • Microsoft BI 中的 BI 开发

  • 数据仓库设计:组合日期时间维度与单独的日期和时间维度和时区

  • 我可以降级 SSIS 包以在旧版本的 SQL 上运行吗

  • 在 Microsoft BI 中查找改进材料

  • 约束 SSIS 执行进程任务的最简单方法

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve