2011-08-31 31 views
10

我是SSIS的新手,需要幫助。我找到了一個article,它描述瞭如何檢測存在和已更改的行。我缺少的部分是如何更新已更改的行。我發現一些文章說,刪除已更改的記錄並插入新記錄集也是很好的解決方案。事情是我不知道如何做刪除(紅框)的步驟。SSIS - 刪除行

有什麼建議嗎?

enter image description here

回答

17

如果您有內數據刪除行流任務,那麼你需要使用OLE DB Command轉型寫一個DELETE語句像DELETE FROM dbo.Table WHERE ColumnName = ?。然後在OLE DB Command轉換的列映射中,您將映射由問號表示的參數與來自上一個轉換的數據。在你的情況下,來自歐盟所有2.

然而數據,因爲OLE DB命令執行的每一行,我不會建議選項,如果有太多的行可能你的包放緩。

我建議是這樣的:

  1. Union All 2輸出重定向到一個臨時的臨時表(比如dbo.Staging)使用OLE DB目標

  2. 讓我們假設您的最終目的地表是dbo.Destination。現在,您的登臺表具有應該從表格Destination中刪除的所有記錄。

  3. 控制流程選項卡上,在Data Flow Task之後放置一個Execute SQL Task。在執行SQL任務中,編寫SQL語句或使用調用SQL語句的存儲過程來加入Staging和Destination之間的記錄,以從Destination表中刪除所有匹配的行。

  4. 另外,在數據流任務之前放置另一個執行SQL任務。在此執行SQL任務中,從暫存表中刪除/截斷行。

像這樣的東西可能會刪除行:。

DELETE  D 
FROM  dbo.Destination D 
INNER JOIN dbo.Staging  S 
ON   D.DestinationId = S.StagingId 

希望有幫助。

+0

這聽起來像一個很好的計劃。我現在就試試看,並讓你知道結果。謝謝你Siva! –

+3

順便說一句,你有什麼建議讓dbo.Staging表臨時?創建將刪除此表的新數據流任務?或者我只刪除數據並將臨時表保留在那裏? –

-4

我建議您使用Spoon(壺)它更靈活,它有一個稱爲「維度查找/更新」的設計工具,可幫助您維護維度表,您可以指定您想要的操作取決於列更改(更新記錄,插入新記錄),所有這些都基於記錄的時間版本控制。

1

除了user756519 answer。如果你有幾百萬條記錄刪除ExecuteSQL的最後一步(4)Delete語句可以用類似這樣的方式批量完成:

WHILE (1=1) 
BEGIN 
    DELETE D 
    from dbo.Destination D 
    inner join 
    (
     -- select ids that should be removed from table 
     SELECT TOP(10000) DestinationId 
     FROM 
      (
      SELECT 
       D1.DestinationId, 
       S.StagingId 
      from 
       dbo.Destination as D1 
      LEFT JOIN 
       dbo.Staging as S 
      ON 
       D1.DestinationId = S.StagingId 
      ) AS G 
     WHERE 
      StagingId IS NULL 
    ) as R 
    on D.DestinationId = R.DestinationId; 

    IF @@ROWCOUNT < 1 BREAK 

    -- info message 
    DECLARE @timestamp VARCHAR(50) 
    SELECT @timestamp = CAST(getdate() AS VARCHAR) 
    RAISERROR ('Chunk deleted %s', 10, 1,@timestamp) WITH NOWAIT 
END