【问题标题】:update a particular column with SSIS Package使用 SSIS 包更新特定列
【发布时间】:2018-06-06 04:14:35
【问题描述】:

我正在尝试使用 SSIS 包更新特定列,但不确定出了什么问题,下面是详细信息。

我有 2 个表 DETAIL 和 USER, 我正在尝试构建一个包,它将找到具有以下条件的行

DETAIL.ID <> 'EXCLUDE',
DETAIL.USERNAME <>'N/A',
and DETAIL.USERNAME <> USER.USERNAME

一旦有了行,我想用DETAIL.USERNAME 字段更新USER 表中的USER.USERNAME 列。

我已经构建了一个包如下:

Source - DETAIL table
CONDTIONS -   DETAIL.ID <> 'EXCLUDE' & 
              DETAIL.USERNAME <>'N/A'
LOOKUP - USER table
CONDITION - DETAIL.USERNAME <> USER.USERNAME
DERIVED COLUMN - REPLACE USER.USERNAME with DETAIL.USERNAME 
DESTINATION - USER

这个包失败并给出一个错误,看起来它正在添加额外的行而不是更新它。enter code here

【问题讨论】:

    标签: ssis


    【解决方案1】:

    在某种程度上,这是预期的行为,因为无法告诉 OLEDB Destination 您正在更新而不是插入。 SSIS 数据流任务流适用于read from source -&gt; transform -&gt; insert in destination

    要实现你想要的,我有一个更简单的方法:

    创建一个Data flow task

    • Source - 详细信息表。使用 where 子句过滤以下条件:
      WHERE DETAIL.ID &lt;&gt; 'EXCLUDE' &amp; DETAIL.USERNAME &lt;&gt;'N/A'

    • LOOKUP (no match output) - user.username 列上的 USER 表 (这将带来所有用户名与user.username不同的Details记录)

    • DESTINATION - 暂存表(stg_detail)

    接下来,使用Execute SQL Task 运行批量更新。

    语法:

    UPDATE x
    SET x.username = stg_detail.username
    FROM user x
    INNER JOIN stg_detail
    ON x.ID = stg_detail.ID
    

    【讨论】:

    • 数据流任务 + 暂存表 + 执行 SQL 任务与仅使用执行 SQL 任务执行 UPDATE..SELECT 作为单个 SQL 语句的优势是什么?
    • @mbeckish,临时表可用于在更新源表之前根据需要执行其他转换。通过分段很容易调试、查找重复项或不匹配项。暂存的行为是截断并重新加载,因此没有数据存储问题。如果这是 OP 的要求,UPDATE..SELECT 也将起作用。
    • @mbeckish,数据流任务的另一个优点是它能够使用的不仅仅是数据库源。
    【解决方案2】:

    所以,我的要求略有不同,因为我从 Excel 加载并需要更新一个表并插入另一个表。但是对于“如何更新 SSIS 中的列”的问题,我决定使用 Conditional Split(它基本上会创建一个内存表,所以谨慎使用)然后使用OLE DB Command,这让我可以跳过创建临时表并在我的 UPDATE 语句中使用前面步骤的输出。

    命令文本就是UPDATE Table1 SET Col1=? WHERE ID=?

    哒哒!在 SSIS 中完全验证 UPDATE

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-24
      • 1970-01-01
      相关资源
      最近更新 更多