あなたのコードを投稿すると、それが参考になります。多くの場合、SQLは「セットベース」の方法で複数の値を処理するように変更できます。言い換えれば、処理する一連の値があれば、それらを同時に処理することができます。
これを達成する方法はたくさんあります。区切られた文字列を渡して、それをあなたのprocで解析することができます。この実装に関する多くのアイデアhere
APPLY
を使用してXMLを渡し、procのXMLに「結合」することもできます。 SQLで
2008+あなたは私はあなたがエリアIDパラメータでやっている内容を正確に把握していないので、私はので、ここであなたの質問に答えてきた場合、私は知らないTable Valued Parameters
を使用することができますが、いくつかのより多くのです情報
ストアドプロシージャを非同期に実行する場合は、パラメータをキューに入れて別のスレッドがキューを処理できるようにするService Brokerが最適です。 SQLは、すべての順序付け、ロック、再試行、スレッドの生成/消去などを管理します。非常に堅牢なシステムです。
進捗状況の追跡に関するOPに接続されているように見える別のユーザーからの質問にコメントがあります。
バッチIDとareaIDパラメータとステータスフラグを含む「キュー」テーブルがあります。あなたのアプリとコールの一意のバッチIDを持つキュー表に
CREATE TABLE asynchQueue
(
RecNo INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,
BatchID INT,
AreaID INT,
Status TINYINT
)
あなたのC#のアプリインサート(グループへのご要望)
あなたは、このように定期的に実行するようにスケジュールPROCがあります。
CREATE PROC ProcessQueue
AS
BEGIN
SET XACT_ABORT ON
DECLARE @RecNo INT,
@AreaId INT
BEGIN TRAN
SELECT TOP 1 @RecNo = recNo,
@AreaID = areaId
FROM AsynchQueue WITH ROWLOCK, XLOCK
WHERE Status = 0
UPDATE AsynchQueue SET Status = 1 --Mark record as in progress
WHERE RecNo = @RecNo
COMMIT
EXEC YourProc @AreaId
UPDATE AsynchQueue SET Status = 2 -- Mark Record as complete
WHERE RecNo = @RecNo
END
を
また、procには、テーブル内のすべてのレコードを処理するためのループを含めることができます。 John Weldonが提案したように、procはsp_start_jobを使用してオンデマンドでスケジュール設定または起動することができます。次のように
その後、状況を照会できます。
SELECT COUNT(NULLIF(Status, 0))/COUNT(*) as PctComplete --in progress or complete div by total
FROM AsynchQueue WITH NOLOCK
WHERE BatchID = @yourBatchId
そのクエリはあなたのバッチの完全なパーセントを与えます。
おそらく、いくつかの 'AreaID'をとり、SQLサーバー上で一度にすべての処理を行う新しいストアドプロシージャを書くことができます。 –
@CoryLarsonはあなたに同意しましたが、処理の進捗状況を示す必要がある場合があります。 – Damith