代码之家  ›  专栏  ›  技术社区  ›  Zepplock

插入时更新

  •  0
  • Zepplock  · 技术社区  · 16 年前

    请先阅读更新1!这是SSIS的具体问题。

    1. 我需要定期将数据从MySQL中的表A移动到MsSQL中的表B。
    2. 然后需要更新表A中所有移动的行(更改单个列的值)。

    我通过创建以下数据流完成了任务1:ADO NET源代码->数据转换->SQL Server目标。它工作得很好。我运行这个查询X分钟。

    使用SSIS工具 ,如何更新我在MySQL中刚刚“数据流”的行?如果我要使用普通SQL,我会这样做(在MySql中):

    更新表格mytable set status=“已移动”,其中。。。

    (这将确保下一次任务1拉出数据时,它将跳过所有已“移动”的行)

    所以问题是我不知道如何将第二个任务中的WHERE子句与第一个任务的结果集连接起来。

    更新1:我对优化更新过程不太感兴趣。我在这里对其进行了简化,以强调以下问题:如何实现这一点 在SSIS中 . 我特别感兴趣的是,我需要在SSI中使用什么样的数据/控制流块?序列是什么。

    4 回复  |  直到 16 年前
        1
  •  2
  •   Damir Sudarevic    16 年前

    我发现最简单的是有一个中间状态,如:

    0 = not moved, 1 = scheduled to move,  2 = moved
    
    • 因此,首先使用 status = 1
    • 当交易成功时, UPDATE myTable SET status = 2 WHERE status = 1

    你可以用 多播 CapturedRows 执行SQL任务 要更新源表中的行,请执行以下操作:

    UPDATE myTable SET status = 'moved' WHERE ID IN (SELECT ID FROM CapturedRows)
    

    在此之后,您将使用另一个 执行SQL任务 截断 俘虏 桌子

    你也可以连接 OLE DB命令 直接地,随着记录的流动,一个一个地更新记录——但那将是相当缓慢的。

    失败时的失败包 对于 确保在插入失败时停止,并 交易选择权 对于需要的包和 数据流 支持。

        2
  •  1
  •   Tim Cooper    14 年前

    做这类事情的一种方法:

    1. 像现在一样,将数据从临时表(源)移动到目标系统

    2. 更新临时表中ID所在的主源表

        3
  •  0
  •   fupsduck    16 年前

        4
  •  0
  •   John Conde    13 年前
    select max(id) from a
    
    [copy rows to b]
    
    update a set moved = 1 where id <= ?
    
    推荐文章