私は高い同時実行の条件でFIFO queueとしてテーブルを使用して、このようにアトミックデキューしています:EXEC stored_procedureからOUTPUT deleted.xをキャプチャする正しい方法は何ですか?
CREATE PROCEDURE [jobs].[DequeueJob]
AS
BEGIN
DELETE TOP(1)
FROM jobs.JobQueue WITH (ROWLOCK, READPAST)
OUTPUT deleted.JobID;
END
私はdeleted.JobID
をキャプチャして使用するために別のから、このストアドプロシージャを呼び出すので、私はこれがあります。
CREATE PROCEDURE [jobs].[GetJob]
AS
BEGIN
DECLARE @Job TABLE (JobID int)
INSERT @Job EXEC jobs.DequeueJob
DECLARE @JobID int
SET @JobID = (SELECT JobID from @Job)
UPDATE jobs.Jobs
SET IsInQueue = 0
WHERE JobID = @JobID
SELECT *
FROM jobs.Jobs
WHERE JobID = @JobID
END
これは正常に動作しますが、それは臭い:バック私が使用する値(JobID
)を取得するために、私はそれに1列、INSERT
行でテーブル変数を作成する必要があり、その後、すぐにSELECT
同じ行でる。アトミック性を損なわないEXEC jobs.DequeueJob
を呼び出すと、deleted.JobID
をキャプチャするより良い方法がありますか(可読性または最適化の観点から)
EXEC @JobID = jobs.DequeueJob
は有効な構文であり、有望ですが、OUTPUT
の値ではなく戻り値を取得します。 This answerにはいくつかの結果渡しオプションの良い議論がありますが、私の状況をそれらのいずれかに適合させる方法を見つけることはできません。
私はSQL Server 2012 SP3を使用していますが、これより新しい構文でこの構文が改善されている場合は、アップグレードする準備が整いました。
私の考えでは、@tablevariableにdeleted.idを出力するよりも良い方法はありません –