来自 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:
为什么当我在 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: