我有一个SSIS程序,从一个非常有活力的表和插入取其行发现到一个表在不同的数据库,截断原始源表之前读取。
由于源表这截断并不奇怪导致行它不能够进入第二数据库的动态性质。
什么是只删除已迁移的那些行的最好方法?
有源表上标识列,但它不跨迁移。
我不能更改表模式。
我有一个SSIS程序,从一个非常有活力的表和插入取其行发现到一个表在不同的数据库,截断原始源表之前读取。
由于源表这截断并不奇怪导致行它不能够进入第二数据库的动态性质。
什么是只删除已迁移的那些行的最好方法?
有源表上标识列,但它不跨迁移。
我不能更改表模式。
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!
一种选择是创建一个表来记录你的处理记录的身份进入,然后一个单独的包(或数据流),以删除这些记录。 如果您已经登录处理的记录地方,那么你可以只添加有身份 - 否则,创建一个新表来存储数据。
第二个选择:如果你想避免产生额外的表,然后将记录选择和记录处理分成两个阶段。 概括地说,你在控制流中选择所有记录,然后再处理他们接一个的数据流。 特别:
有这个网上的不少例子; 例如这一个从古老的杰米汤姆森,或这一个 ,其包括多一点的细节。
请注意,您没有谈数据的规模; 如果你有非常大的数字记录的第一个建议可能是一个更好的选择。 请注意,在这两种情况下,你失去了表截断的优势(因为您使用的是标准delete
通话)。