3

SSIS の進行状況ログにある偽の警告を取り除こうとしています。生の SQL を使用して作業を行うタスクで、未使用の列に関する警告がたくさん表示されます。新しいデータをロードする前にステージング テーブルにデータをアーカイブするデータ フローがあります。データ フローは次のようになります。

+--------------------+
| OLEDB Source task: |
| read staging table |
+--------------------+
          |
          |
+---------------------------+
| OLEDB Command task:       |
| upsert into history table |
+---------------------------+
          |
          |
+---------------------------+
| OLEDB Command task:       |
| delete from staging table |
+---------------------------+

私の「upsert」タスクは次のようなものです:

--------------------------------------
-- update existing rows first...
update history
set    field1 = s.field1
    ...
from   history h
inner  join staging s
on     h.id = s.id
where  h.last_edit_date <> s.last_edit_date -- only update changed records

-- ... then insert new rows
insert into history
select s.*
from   staging s
join   history h
on     h.id = s.id
where  h.id is null
--------------------------------------

クリーンアップ タスクも SQL コマンドです。

--------------------------------------
delete from staging
--------------------------------------

upsert タスクには出力列の定義がないため、ログに一連の警告が表示されます。

[DTS.Pipeline] Warning: The output column "product_id" (693) on output 
"OLE DB Source Output" (692) and component "read Piv_product staging table" (681) 
is not subsequently used in the Data Flow task. Removing this unused output column 
can increase Data Flow task performance. 

これらの列への参照を削除するにはどうすればよいですか? いくつかの異なるタスクをドロップしようとしましたが、入力列を「飲み込んで」タスクの出力からそれらを抑制するように見えるものはありません。ログをきれいに保ちたいので、実際の問題だけが表示されます。何か案は?

ありがとう!

4

6 に答える 6

5

すべて結合 - 通過させたい列のみを選択し、他の列を削除します。

2008年版でこれに対処して、パイプラインから列をトリミング/抑制できるようにする予定だと思いました。

于 2008-11-05T21:42:10.517 に答える
2

OK、MSDNフォーラムで回避策を入手しました:

タスク1と2の間でスクリプトコンポーネント変換を使用します。すべての入力列を選択します。スクリプト本体は空のままにします。

これは列を消費し、ジョブは適切に処理され、警告はログに記録されません。

タスク2のSQLはソーステーブルに接続してすべての作業を実行するため、OLEDBソースが必要な理由はまだわかりませんが、OLEDBソースを削除すると、データフローは実行されますが行は処理されないため、ステージングが行われます。テーブルが空になることはなく、PK違反が原因で、変更された行をステージングテーブルに配置するダウンストリームプロセスが失敗します。しかし、それは別の日の問題です。これは少し不格好ですが、私のログはきれいです。

于 2008-11-06T00:57:05.240 に答える
1

パイプラインでの警告は、後続のタスクで使用されていない列がデータ ソースで選択されているために発生します。

これを簡単に修正するには、データ ソースをダブルクリックします。あなたの場合 (OLEDB Source task: | | read staging table) 次に、列をクリックし、将来のタスク項目で必要のない列を選択解除します。

これにより、進行状況ログからこれらの警告が削除されます。

ただし、上記のアイテムを読んで、他の回答で説明されているように、後続のアイテムでソースタスクの列を使用していないため、簡単に削除できます。

于 2008-11-27T07:17:51.917 に答える
0

あなたの問題をもう一度見てみると、あなたは「穀物に対して」SSISを使用していると思います。アップサートは特定の行の何にも依存していないようで、クリーンアップもしていないように見えるため、ステージングテーブルから読み取っているものを実際にはフォローしていません。

クリーンアップは行ごとに 1 回実行されるように思えますが、それは実際には意味がありません。

通常、DataFlow は、パイプラインを通過する各行に対して一括アクションを実行するためには使用されません。パイプラインを使用している場合、UPSERT はルックアップ (またはサードパーティの TableDifference) コンポーネントを使用して処理され、パイプライン内の OLEDB 宛先 (BULK INSERT) と OLEDB コマンド (UPDATE ごとに 1 回) または別の OLDEB 宛先のいずれかへの spli を使用して処理されます。 「UPDATEステージングテーブル」。

通常、これは DataFlow を使用して分割せずにステージング テーブルをロードし、次に制御フロー内の 1 つの SQL 実行タスクを使用して、SP を呼び出すことにより (あなたが持っているように) ストレート SQL UPSERT で他のすべてを実行します。

OLEDBCommand は、ステージング テーブルが不要で、代わりにフラット ファイルを読み取り、Lookup コンポーネントなどを使用して UPDATE または INSERT を実行する場合に便利です。ただし、パイプラインのすべての行に対して呼び出されます。

于 2008-11-07T22:08:40.963 に答える
0

「 upsert DataFlow Task」で終了する必要があります。次に、制御フローに戻り、Execute SQL Taskステージングから削除するための を作成します。DataFlow Taskを exec sql にリンクします。

アップサートにサードパーティのツールは使用しませんが、Cade が示唆するように、データフローをOLE DB Destination(または同様の) に向かう新しいレコードに分割し、更新のために oledb コマンドに移動できるレコードを更新します。 . マージ結合またはルックアップを使用してフローを分割できます。

于 2008-11-20T18:41:08.903 に答える