この古い質問は、より包括的な答えに値します。これらのいくつかはここの他の回答/コメントで言及されていますが、OPの特定の状況では機能する場合と機能しない場合がありますが、SQLからストアドプロシージャを非同期に呼び出すことを求めている場合は機能する場合があります。
単に完全に明示するために、TSQLには(それ自体では)他のTSQL操作を非同期に起動する機能はありません。
それはあなたがまだ多くのオプションを持っていないという意味ではありません:
- SQLエージェントジョブ:複数のSQLジョブを作成し、必要な時間に実行するようにスケジュールするか、を使用して「マスターコントロール」ストアドプロシージャから非同期に開始します
sp_start_job
。プログラムで進捗を監視する必要がある場合は、各ジョブがカスタムJOB_PROGRESSテーブルを更新することを確認してください(または、グレゴリーA.ラーセンによるこの優れた記事でxp_sqlagent_enum_jobs
説明されているように、文書化されていない機能の使用が完了したかどうかを確認できます)。異なるプロセスで同じストアドプロシージャを実行している場合でも、並列プロセスを実行するのと同じ数の個別のジョブを作成する必要があります。
- SSISパッケージ:より複雑な非同期シナリオの場合は、単純な分岐タスクフローでSSISパッケージを作成します。SSISは、これらのタスクを個別のspidで起動し、SQLはこれを並行して実行します。SQLエージェントジョブからSSISパッケージを呼び出します。
- カスタムアプリケーション:選択した言語(C#、Powershellなど)で、その言語が提供する非同期メソッドを使用して、シンプルなカスタムアプリケーションを作成します。各アプリケーションスレッドでSQLストアドプロシージャを呼び出します。
- OLEオートメーション:SQLで、
sp_oacreate
とsp_oamethod
を使用して、Gregory A. Larsenによるこの記事で説明されているように、お互いにストアドプロシージャを呼び出す新しいプロセスを起動します。
- Service Broker:この記事の非同期実行の良い例であるService Brokerの使用方法を調べてください。
- CLR並列実行:CLRコマンド
Parallel_AddSql
を使用し、Alan Kaplanによるこの記事のParallel_Execute
説明に従ってください(SQL2005 +のみ)。
- スケジュールされたWindowsタスク:完全を期してリストされていますが、私はこのオプションのファンではありません。
私なら、おそらくより単純なシナリオでは複数のSQLエージェントジョブを使用し、より複雑なシナリオではSSISパッケージを使用するでしょう。
あなたの場合、SQL Agentジョブの呼び出しは、簡単で管理しやすい選択のように聞こえます。
最後のコメント:SQLは、可能な限りいつでも個々の操作を並列化しようとします*。これは、2つのタスクを交互に実行するのではなく、同時に実行しても、それがより早く終了するという保証がないことを意味します。実際に何かを改善するかどうかを注意深くテストします。
8つのタスクを同時に実行するDTSパッケージを作成した開発者がいました。残念ながら、4 CPUサーバーのみでした:)
*デフォルト設定を前提としています。これは、サーバーの最大並列度またはアフィニティマスクを変更するか、MAXDOPクエリヒントを使用して変更できます。