2

元のソース テーブルを切り捨てる前に、非常に動的なテーブルから読み取り、別のデータベースのテーブルに見つかった行を挿入する SSIS ルーチンがあります。

ソース テーブルの動的な性質により、この切り捨てにより、驚くことではありませんが、行が 2 番目のデータベースに到達しません。

移行された行のみを削除する最善の方法は何ですか?

ソース テーブルに ID 列がありますが、移行されません。

どちらのテーブル スキーマも変更できません。

4

2 に答える 2

4

ばかげているように聞こえるかもしれませんが、機能するオプションは、最初に削除してから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;

結果

効く、効く!

于 2013-03-19T18:57:35.310 に答える
1

1つのオプションは、処理されたレコードのIDをログインするためのテーブルを作成し、次にそれらのレコードを削除するための別のパッケージ(またはデータフロー)を作成することです。処理済みのレコードをすでにどこかに記録している場合は、そこにIDを追加するだけで済みます。それ以外の場合は、データを格納するための新しいテーブルを作成します。

2番目のオプション:追加のテーブルの作成を避けたい場合は、レコードの選択とレコードの処理を2つの段階に分けます。大まかに言うと、制御フローですべてのレコードを選択してから、データフローでそれらを1つずつ処理します。具体的には:

  1. オブジェクトタイプの変数を作成してレコードリストを格納し、IDタイプ(おそらくint)に一致する別の変数を作成して「現在のレコードID」を格納します。
  2. 制御フローで、クエリを使用して処理するID値のリストを作成し、それらをrecordlist変数に格納するSQL実行タスクを追加します。
  3. Foreachループコンテナを追加して、そのリストを処理します。foreachタスクは、現在のレコード識別子を上記で定義した2番目の変数にロードします。
  4. foreachタスクで、データフローを追加してその単一のレコードをコピーしてから、ソースから削除します。

このオンラインの例はかなりたくさんあります。たとえば、これは由緒あるジェイミー・トムソンのもの、またはもう少し詳細が含まれているものです

データの規模については話していないことに注意してください。レコードの数が非常に多い場合は、最初の提案の方が適している可能性があります。どちらの場合も、テーブルの切り捨ての利点が失われることに注意してください(標準のdelete呼び出しを使用しているため)。

于 2013-03-19T16:11:58.747 に答える