2017-04-24 116 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

谢谢你的工作 –