最初の「高度な」SSIS パッケージで並列処理の問題が発生しました。
まず、パッケージの最後は次のとおりです。
このパッケージは何をしますか :
- Excel からデータを読み込み、いくつかの操作/集計/コントロールを実行します
- コントロールに基づいて、行を統合するか (左ブランチ)、統合しないか (右ブランチ) を決定します。
- 問題がなければ、いくつかの計算が実行され、行が追加され、いくつかの統計情報を含むログが書き込まれます (これは左ブランチの OLE DB コマンドです)。
- 行が拒否された場合、それは拒否ファイルに追加され、いくつかの統計とともにログが書き込まれます (右ブランチの OLE DB コマンド)
ファイルのロードごとに 1 つのログ行のみが生成されるため、成功ログと失敗ログの情報は同じ行に書き込まれます (同じ実行中に複数のファイルをインポートできるため、実行 GUID とインポートされたファイル名によって識別されます)。ただし、入力された列は同じではありません。 .
どちらの OLE DB コマンドも、次のような同じストアド プロシージャを呼び出します。
- 行が存在するかどうかを確認します
- 存在しない場合は、新しい行を追加します
- それ以外の場合は、正しい列を更新します
誰かが問題を提起するまで、これはかなりうまく機能していました。実行により、成功情報を含む行と拒否された情報を含む行の 2 つの行が生成されることがあります。
分析した後、両方の OLE DB コマンドが同時に実行される可能性があることに気付きました。そのため、どちらも既存の行を認識せず、両方とも新しい行を挿入します。
OLE DB コマンドが同時に実行されないようにする方法があるかどうかを知りたいです。ここではパフォーマンスは問題にならないので、実行時間が長くなるかどうかは気にしません。
私が見る唯一の解決策は、テーブルに一意の制約を追加してエラーをキャッチすることですが、これが本当に「エレガントな」解決策であるかどうかはわかりません(「通常の」UPDATEステートメントを複製するという考えは好きではありませんおよび「例外」のもの)なので、例外をキャッチする必要のない解決策を探しています!
もちろん、他に良い解決策がなければ、そうするでしょう。