2017-04-24 189 views
-1

爲什麼當我第二次在Visual Studio 2013中執行我的ssis包時,我在OLE DB目標中遇到了一個問題,告訴我我的sql服務器中已經有了這些數據。所以我該怎麼做 !!我希望,當我第二次執行它時,我的ssis能夠識別我的數據並且不會導致問題並正常執行。 this is my ssis package this is my sql data從Visual Studio SSIS包執行

+0

嗯,你已經設置表,所以你不能插入相同的數據的兩倍。您可以在加載之前將其清除,或者在流中包含查找以匹配存在的數據,因此您只能插入不存在的數據。 – Rich

+0

我不知道如何使用它! (查找任務) –

+0

很酷,希望這是一個指向正確方向的指針 - 網上會有大量關於如何使用查找任務的教程。 – Rich

回答

2

在你的情況,我建議你創建一個TRSF表像下面的代碼:在你的包在第一

CREATE TABLE dbo.TRFS_TD_Titles 
    (
    Title_ID varchar(50), 
    Title varchar(500), 
    [Type] varchar(500) 
    ) 

然後IIN您ControlFlow你應該在這個清除所有記錄運行命令在您的DataFlow task之前的表。

您需要在的DataFlow task之前加上Execute SQL Task

然後通過運行此命令你Execute SQL Task

Truncate Table dbo.TRFS_TD_Titles 

然後在你的DataFlow你只需要更改目標表中的最後一個組件(OLE DB目標)(在你的包它命名爲TD標題) 。您必須將所有行轉移到dbo.TRFS_TD_Titles

然後在你ControlFlow,添加第二個Execute SQL TaskDataFlow後並運行此命令:

MERGE dbo.TD_Titles AS T 
    USING dbo.TRFS_TD_Titles AS S 
    ON T.Title_ID = S.Title_ID 
    WHEN MATCHED THEN 
    UPDATE 
     SET 
     T.Title = S.Title, 
     T.Type = S.type 
    WHEN NOT MATCHED BY TARGET THEN 
    INSERT 
     (Title_ID,Title,[Type]) 
    VALUES 
     (S.Title_ID,S.Title,S.[Type]) 
    WHEN NOT MATCHED BY SOURCE THEN 
    DELETE 
    ; 

如果你不需要從你的目標表中刪除記錄(dbo.TD_Titles),你應該只在你的第二個Execute SQL Task運行此命令:

MERGE dbo.TD_Titles AS T 
USING dbo.TRFS_TD_Titles AS S 
ON T.Title_ID = S.Title_ID 
WHEN MATCHED THEN 
UPDATE 
    SET 
    T.Title = S.Title, 
    T.Type = S.type 
WHEN NOT MATCHED BY TARGET THEN 
INSERT 
    (Title_ID,Title,[Type]) 
VALUES 
    (S.Title_ID,S.Title,S.[Type]); 

而且如果你不需要在你的目的地,以更新現有行(dbo.TD_Titles)你只需要在你的第二個Execute SQL Task運行此命令:

MERGE dbo.TD_Titles AS T 
    USING dbo.TRFS_TD_Titles AS S 
    ON T.Title_ID = S.Title_ID 
    WHEN NOT MATCHED BY TARGET THEN 
    INSERT 
     (Title_ID,Title,[Type]) 
    VALUES 
     (S.Title_ID,S.Title,S.[Type]); 

你將有一個ControlFlow這樣的形象:

enter image description here

+0

謝謝你的工作 –