我是SSIS的新手,需要幫助。我找到了一個article,它描述瞭如何檢測存在和已更改的行。我缺少的部分是如何更新已更改的行。我發現一些文章說,刪除已更改的記錄並插入新記錄集也是很好的解決方案。事情是我不知道如何做刪除(紅框)的步驟。SSIS - 刪除行
有什麼建議嗎?
我是SSIS的新手,需要幫助。我找到了一個article,它描述瞭如何檢測存在和已更改的行。我缺少的部分是如何更新已更改的行。我發現一些文章說,刪除已更改的記錄並插入新記錄集也是很好的解決方案。事情是我不知道如何做刪除(紅框)的步驟。SSIS - 刪除行
有什麼建議嗎?
如果您有內數據刪除行流任務,那麼你需要使用OLE DB Command
轉型寫一個DELETE語句像DELETE FROM dbo.Table WHERE ColumnName = ?
。然後在OLE DB Command轉換的列映射中,您將映射由問號表示的參數與來自上一個轉換的數據。在你的情況下,來自歐盟所有2.
然而數據,因爲OLE DB命令執行的每一行,我不會建議選項,如果有太多的行可能你的包放緩。
我建議是這樣的:
從Union All 2
輸出重定向到一個臨時的臨時表(比如dbo.Staging)使用OLE DB目標。
讓我們假設您的最終目的地表是dbo.Destination。現在,您的登臺表具有應該從表格Destination中刪除的所有記錄。
在控制流程選項卡上,在Data Flow Task
之後放置一個Execute SQL Task
。在執行SQL任務中,編寫SQL語句或使用調用SQL語句的存儲過程來加入Staging和Destination之間的記錄,以從Destination表中刪除所有匹配的行。
另外,在數據流任務之前放置另一個執行SQL任務。在此執行SQL任務中,從暫存表中刪除/截斷行。
像這樣的東西可能會刪除行:。
DELETE D
FROM dbo.Destination D
INNER JOIN dbo.Staging S
ON D.DestinationId = S.StagingId
希望有幫助。
我建議您使用Spoon(壺)它更靈活,它有一個稱爲「維度查找/更新」的設計工具,可幫助您維護維度表,您可以指定您想要的操作取決於列更改(更新記錄,插入新記錄),所有這些都基於記錄的時間版本控制。
除了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
這聽起來像一個很好的計劃。我現在就試試看,並讓你知道結果。謝謝你Siva! –
順便說一句,你有什麼建議讓dbo.Staging表臨時?創建將刪除此表的新數據流任務?或者我只刪除數據並將臨時表保留在那裏? –