0

oledb データ ソースを持つデータフローがあります。次に、3 つの Web サービス呼び出しを実行するスクリプト コンポーネントがあります。これには、入力行に対して (事実上) 同期する 2 つの出力 (入力行ごとに 1 つの出力行) と、非同期の 1 つの出力 (入力ごとに多くの行を出力する) があります。行)。各出力は sql update コマンドに送られます。エラー ログ出力もあります (これも非同期)。

入力行ごとに、行が完全に処理および更新されていない場合、その入力行の更新が成功しないように、何らかの方法で出力をトランザクションにラップしたいと考えています。

私が知る限り、これが機能する方法は、更新コマンドに移る前に、スクリプトが各入力行を処理し、すべてをバッファーに出力することです。行ごとにすべての更新を実行する代わりに、各入力行が処理および更新されたときに変更をコミットします。

これを達成するためにデータフローをどのように構築できますか?

おそらくソースを実行してから foreach コンテナーを介してレコードを実行することを考えていますが、ForEach コンテナーを介して複数の DataFlow を連鎖させる方法がわかりません。

4

2 に答える 2

0

唯一の方法は、更新を含むすべてを単一のスクリプトに入れることだと思います。SSIS は、その細かいレベルの制御を提供するのに十分なデータフロー バッファリング戦略を公開していません。実際、パイプライン内で物事を高速化するために多大な努力を払っていますが、これはあなたが探しているスロットリング戦略とは正反対です. (使用可能なチューニング機能については、MSDN のデータ フロー パフォーマンス機能を参照してください。)

または、完全にカスタムの宛先パイプライン コンポーネントを構築することもできます。SSIS 2008 でのスクリプト コンポーネントのデバッグがいかに面倒であるかを考えると、それは好ましいアプローチかもしれません。

于 2013-03-27T21:41:08.643 に答える
0

ここでの解決策は、変数に配置されるレコードセットにユーザーを選択するデータ フロー タスクを作成することです。

次に、For Each コンテナーを使用してレコードセットを読み取り、ユーザー名を変数に入れます。For Each の横には、変数をパラメーターとして使用してユーザーを再度選択する OLEDB ソースを持つデータフローがあります (これにより、データセットの反復ごとに検索が行われますが、問題ありません)。

これは私のスクリプトにフィードされます。

さらに、for each ループ内のパッケージの前後に SQL 実行タスクを配置することで、DTC トランザクションを使用する必要がなくなり、各入力行を個別のトランザクションとして処理できるようになりました。

于 2013-03-28T20:15:47.893 に答える