2010-01-01 91 views
0

請首先閱讀Update1!這是SSIS的具體問題。插入更新

我有以下任務:

  1. 我需要定期在MySQL在MSSQL中移動從表的數據表B。
  2. 然後需要在表A中更新所有移動的行(更改單個列值)。

我通過創建以下數據流完成了任務1:ADO NET Source - > Data Conversion - > SQL Server Destination。它運作良好。我運行這個查詢X分鐘。

現在,使用SSIS工具,我該如何更新我剛纔在MySQL中編輯「數據流」的行?如果我是使用普通的SQL我做(在MySQL):

更新表mytable的設置狀態=「感動」 WHERE ...

(這將確保下一次任務1將數據拉出 - 它跳過已經「移動」的所有行)

所以問題是我不知道如何將第二個任務中的WHERE子句與第一個任務的結果集連接起來。

更新1:我對優化更新過程不太感興趣。我在此簡化了它,以強調以下問題:如何在SSIS中實現此。我特別感興趣的是SSIS中需要使用什麼類型的數據/控制流程塊。做這種類型的事情

回答

2

我發現,最簡單的就是有一個像中間狀態:

0 = not moved, 1 = scheduled to move, 2 = moved 
  • 所以,你在源頭第一旗行與status = 1
  • 然後將這些行移過
  • 交易成功時,UPDATE myTable SET status = 2 WHERE status = 1

後,您的UPDATE:

你可以只轉移了到另一個表CapturedRows在源數據庫記錄您的目的地和捕捉的ID之前使用組播。在使用後執行SQL任務在源表更新行,如:

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

此之後,你會用另一種執行SQL任務截斷CapturedRows表。

你也可以連接OLE DB命令直接在組播,更新記錄一個接一個,因爲他們流 - 但是這將是相當緩慢。

要使用這個,你就必須設置失敗包放在故障數據流任務,以確保其如果插入故障並停止對包交易選項所需,爲數據流程以支持。

0
select max(id) from a 

[copy rows to b] 

update a set moved = 1 where id <= ? 
1

方式一:

  1. 複製的數據移動到一個臨時表中的源系統上

  2. 移動從臨時表中的數據(源)到您的目標系統,就像您現在所做的那樣

  3. 更新主源表,其中的ID位於臨時表中

  4. 下降臨時表

0

爲table-a定義了一個on-update觸發器,當table-a.status被更改爲「moved」時,將該記錄插入到表b中。