来自 Visual Studio 的 SSIS 包执行

SSIS Package Execution from Visual Studio

为什么当我在 visual studio 2013 中第二次执行我的 ssis 包时,我的 OLE DB 目标出现问题,告诉我我的 sql 服务器中已经有这些数据。所以我该怎么做 !!我希望,当我第二次执行它时,我的 ssis 能够识别我的数据并且不会引起问题并正常执行。

根据您的情况,我建议您创建一个 TRSF table,如下代码:

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

然后在你的包中,首先在你的 ControlFlow 中你应该 运行 在你的 DataFlow task 之前清除这个 table 中的所有记录的命令。

您需要在 ControlFlow 中的 DataFlow task 之前添加一个 Execute SQL Task

然后 运行 这个命令由你 Execute SQL Task:

Truncate Table dbo.TRFS_TD_Titles

然后在您的 DataFlow 中,您只需更改最后一个组件(OLE DB 目标)中的目标 table(在您的包中,它名为 TD Title)。您必须将所有行传输到 dbo.TRFS_TD_Titles.

然后在你的 ControlFlow 中,添加第二个 Execute SQL Task 在你的 DataFlow 和 运行 这个命令之后:

   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
    ;

如果您不需要从目标 Table (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: