SSIS的foreach通过一个表,插入到另一个,然后删除源行(SSIS Foreach throu

2019-07-22 00:59发布

我有一个SSIS程序,从一个非常有活力的表和插入取其行发现到一个表在不同的数据库,截断原始源表之前读取。

由于源表这截断并不奇怪导致行它不能够进入第二数据库的动态性质。

什么是只删除已迁移的那些行的最好方法?

有源表上标识列,但它不跨迁移。

我不能更改表模式。

Answer 1:

A option, that might sound stupid but it works, is to delete first and use the OUTPUT clause.

I created a simple control flow that populates a table for me.

IF EXISTS
(
    SELECT 1 FROM sys.tables AS T WHERE T.name = 'DeleteFirst'
)
BEGIN
    DROP TABLE dbo.DeleteFirst;
END

CREATE TABLE dbo.DeleteFirst
(
    [name] sysname
);

INSERT INTO
    dbo.DeleteFirst
SELECT
    V.name
FROM
    master.dbo.spt_values V
WHERE
    V.name IS NOT NULL;

In my OLE DB Source, instead of using a SELECT, DELETE the data you want to go down the pipeline and OUTPUT the DELETED virtual table. Somethinng like

DELETE
    DF
OUTPUT
    DELETED.*
FROM
    dbo.DeleteFirst AS DF;

It works, it works!



Answer 2:

一种选择是创建一个表来记录你的处理记录的身份进入,然后一个单独的包(或数据流),以删除这些记录。 如果您已经登录处理的记录地方,那么你可以只添加有身份 - 否则,创建一个新表来存储数据。

第二个选择:如果你想避免产生额外的表,然后将记录选择和记录处理分成两个阶段。 概括地说,你在控制流中选择所有记录,然后再处理他们接一个的数据流。 特别:

  1. 创建Object类型的变量来存储你的记录列表,另一个变量匹配您的身份类型(INT大概)来存储“当前记录身份”。
  2. 在控制流量,增加其使用的查询来构建标识值的进程列表执行SQL任务,然后将它们存储到recordlist变量。
  3. 添加Foreach循环容器来处理该列表; 在foreach任务将当前记录标识符加载到你上面定义的第二变量。
  4. 在foreach任务,添加一个数据流来复制单个记录,然后从源删除。

有这个网上的不少例子; 例如这一个从古老的杰米汤姆森,或这一个 ,其包括多一点的细节。

请注意,您没有谈数据的规模; 如果你有非常大的数字记录的第一个建议可能是一个更好的选择。 请注意,在这两种情况下,你失去了表截断的优势(因为您使用的是标准delete通话)。



文章来源: SSIS Foreach through a table, insert into another and delete the source row