从Visual Studio

时间:2017-04-24 11:21:16

标签: sql-server visual-studio-2013 ssis

为什么当我第二次在visual studio 2013中执行我的ssis包时,我的OLE DB目标中出现问题告诉我,我已经在我的sql server中有这些数据了。所以我该怎么做 !!我想,当我第二次执行它时,我的ssis识别我的数据并且不会导致问题并正常执行。 this is my ssis package this is my sql data

1 个答案:

答案 0 :(得分:2)

在您的情况下,我建议您创建一个TRSF表,如下面的代码:

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

然后在您的包裹中首先在您的ControlFlow您应该运行命令清除此表中DataFlow task之前的所有记录。

您需要在Execute SQL Task DataFlow task之前添加ControlFlow

然后通过Execute SQL Task

运行此命令
Truncate Table dbo.TRFS_TD_Titles

然后在你的DataFlow中,您只需要更改最后一个组件中的目标表(OLE DB目标)(在您的包中它命名为TD Title)。您必须将所有行转移到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