为什么当我第二次在visual studio 2013中执行我的ssis包时,我的OLE DB目标中出现问题告诉我,我已经在我的sql server中有这些数据了。所以我该怎么做 !!我想,当我第二次执行它时,我的ssis识别我的数据并且不会导致问题并正常执行。
答案 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 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
;
如果您不需要从目标表(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: