元のソース テーブルを切り捨てる前に、非常に動的なテーブルから読み取り、別のデータベースのテーブルに見つかった行を挿入する SSIS ルーチンがあります。
ソース テーブルの動的な性質により、この切り捨てにより、驚くことではありませんが、行が 2 番目のデータベースに到達しません。
移行された行のみを削除する最善の方法は何ですか?
ソース テーブルに ID 列がありますが、移行されません。
どちらのテーブル スキーマも変更できません。
ばかげているように聞こえるかもしれませんが、機能するオプションは、最初に削除してからOUTPUT句を使用することです。
テーブルにデータを入力する単純な制御フローを作成しました。
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;
私の OLE DB ソースでは、SELECT を使用する代わりに、パイプラインをたどりたいデータを DELETE し、DELETED 仮想テーブルを出力します。のようなもの
DELETE
DF
OUTPUT
DELETED.*
FROM
dbo.DeleteFirst AS DF;
効く、効く!
1つのオプションは、処理されたレコードのIDをログインするためのテーブルを作成し、次にそれらのレコードを削除するための別のパッケージ(またはデータフロー)を作成することです。処理済みのレコードをすでにどこかに記録している場合は、そこにIDを追加するだけで済みます。それ以外の場合は、データを格納するための新しいテーブルを作成します。
2番目のオプション:追加のテーブルの作成を避けたい場合は、レコードの選択とレコードの処理を2つの段階に分けます。大まかに言うと、制御フローですべてのレコードを選択してから、データフローでそれらを1つずつ処理します。具体的には:
このオンラインの例はかなりたくさんあります。たとえば、これは由緒あるジェイミー・トムソンのもの、またはもう少し詳細が含まれているものです。
データの規模については話していないことに注意してください。レコードの数が非常に多い場合は、最初の提案の方が適している可能性があります。どちらの場合も、テーブルの切り捨ての利点が失われることに注意してください(標準のdelete
呼び出しを使用しているため)。