插入更新

时间:2010-01-01 18:15:07

标签: sql-server ssis migration

请先阅读Update1!这是SSIS特定的问题。

我有以下任务:

  1. 我需要定期将数据从MySQL中的表A移动到MsSQL中的表B.
  2. 然后,需要在表A中更新所有移动的行(更改单个列值)。
  3. 我通过创建以下数据流完成了任务1:ADO NET Source - >数据转换 - > SQL Server目标。它工作得很好。我运行这个查询X分钟。

    现在,使用SSIS工具,如何在MySQL中更新我只是“数据流”的行?如果我要使用普通的SQL(在MySql中):

      

    更新表mytable set status =“move”WHERE ...

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

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

    Update1:​​我对优化更新程序不太感兴趣。我在这里简化了它,强调了一个问题:如何在SSIS中实现 。我特别感兴趣的是SSIS中需要使用什么类型的数据/控制流块我需要使用什么序列。

4 个答案:

答案 0 :(得分:2)

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

0 = not moved, 1 = scheduled to move,  2 = moved
  • 因此,您首先使用status = 1
  • 在源代码标记行
  • 然后将这些行移到
  • 当交易成功时,UPDATE myTable SET status = 2 WHERE status = 1

您的更新后:

您可以在目的地之前使用多播,并将传输的记录的ID捕获到源DB中的另一个表CapturedRows中。之后,使用执行SQL任务来更新源表中的行,例如:

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

在此之后,您将使用另一个执行SQL任务来截断CapturedRows表。

您还可以直接将 OLE DB命令连接到多播,以便逐个更新记录,但这样会非常慢。

要使用此功能,您必须为数据流任务设置失败时失败包,以确保在插入失败且事务处理时停止选项用于要求的包和数据流支持。

答案 1 :(得分:1)

做这种事情的一种方法是:

  1. 将要移动的数据复制到源系统上的临时表

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

  3. 更新Ids在临时表中的主源表

  4. 删除临时表

答案 2 :(得分:0)

select max(id) from a

[copy rows to b]

update a set moved = 1 where id <= ?

答案 3 :(得分:0)

为table-a定义一个on-update触发器,当table-a.status被改为“move”时,它将记录插入table-b。