我刚接触SSIS,需要在这方面寻求帮助。我找到了一篇文章,描述了如何检测已存在且已更改的行。我缺少的部分是如何更新已更改的行。我找到了一些文章,说删除已更改的记录并插入新的记录集也是一个好的解决方案。问题是我不知道如何执行删除的步骤(红框)。
有什么建议吗?
我刚接触SSIS,需要在这方面寻求帮助。我找到了一篇文章,描述了如何检测已存在且已更改的行。我缺少的部分是如何更新已更改的行。我找到了一些文章,说删除已更改的记录并插入新的记录集也是一个好的解决方案。问题是我不知道如何执行删除的步骤(红框)。
有什么建议吗?
OLE DB Command
转换并编写类似于DELETE FROM dbo.Table WHERE ColumnName = ?
的DELETE语句。然后,在OLE DB Command转换的列映射中,您将使用来自前一个转换的数据将由问号表示的参数映射到数据。在您的情况下,这些数据来自Union All 2。
但是,我不建议使用此选项,因为OLE DB Command对每一行执行一次,如果有太多行,它可能会降低您的包速度。
我建议使用类似以下的方法:
使用 OLE DB 目标 将 Union All 2
的输出重定向到一个临时暂存表(例如dbo.Staging)中。
假设您的最终目标表是 dbo.Destination。现在,您的 Staging 表具有应从 Destination 表中删除的所有记录。
在 控制流 选项卡上,在 Data Flow Task
后放置一个 Execute SQL Task
。在 Execute SQL Task 中,编写一个 SQL 语句或使用存储过程,以调用连接 Staging 和 Destination 记录的 SQL 语句来从 Destination 表中删除所有匹配的行。
此外,在 Data Flow Task 前还要放置另一个 Execute SQL Task。在此 Execute SQL Task 中,从 Staging 表中删除/清除行。
可以尝试使用以下类似内容来删除行:
DELETE D
FROM dbo.Destination D
INNER JOIN dbo.Staging S
ON D.DestinationId = S.StagingId
WHILE (1=1)
BEGIN
DELETE D
from dbo.Destination D
inner join
(
-- select ids that should be removed from table
SELECT TOP(10000) DestinationId
FROM
(
SELECT
D1.DestinationId,
S.StagingId
from
dbo.Destination as D1
LEFT JOIN
dbo.Staging as S
ON
D1.DestinationId = S.StagingId
) AS G
WHERE
StagingId IS NULL
) as R
on D.DestinationId = R.DestinationId;
IF @@ROWCOUNT < 1 BREAK
-- info message
DECLARE @timestamp VARCHAR(50)
SELECT @timestamp = CAST(getdate() AS VARCHAR)
RAISERROR ('Chunk deleted %s', 10, 1,@timestamp) WITH NOWAIT
END