SSIS - 删除行

12

我刚接触SSIS,需要在这方面寻求帮助。我找到了一篇文章,描述了如何检测已存在且已更改的行。我缺少的部分是如何更新已更改的行。我找到了一些文章,说删除已更改的记录并插入新的记录集也是一个好的解决方案。问题是我不知道如何执行删除的步骤(红框)。

有什么建议吗?

enter image description here

2个回答

27
如果您要在数据流任务中删除行,则需要使用OLE DB Command转换并编写类似于DELETE FROM dbo.Table WHERE ColumnName = ?的DELETE语句。然后,在OLE DB Command转换的列映射中,您将使用来自前一个转换的数据将由问号表示的参数映射到数据。在您的情况下,这些数据来自Union All 2。

但是,我不建议使用此选项,因为OLE DB Command对每一行执行一次,如果有太多行,它可能会降低您的包速度。

我建议使用类似以下的方法:

  1. 使用 OLE DB 目标Union All 2 的输出重定向到一个临时暂存表(例如dbo.Staging)中。

  2. 假设您的最终目标表是 dbo.Destination。现在,您的 Staging 表具有应从 Destination 表中删除的所有记录。

  3. 控制流 选项卡上,在 Data Flow Task 后放置一个 Execute SQL Task。在 Execute SQL Task 中,编写一个 SQL 语句或使用存储过程,以调用连接 Staging 和 Destination 记录的 SQL 语句来从 Destination 表中删除所有匹配的行。

  4. 此外,在 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

希望能有所帮助。

这听起来是个不错的计划。我现在会尝试一下并告诉你结果。谢谢你,Siva! - ilija veselica
3
你对于将dbo.Staging表设置为临时表有什么建议?是创建一个新的数据流任务来删除该表呢,还是只删除数据并且保留该临时表一直存在? - ilija veselica

1
除了user756519的答案之外,如果您需要删除数百万条记录,则可以使用以下步骤(步骤4)来批量执行ExecuteSQL Delete语句:
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接