0

次のクエリは、これを実行した直後に更新を実行するために必要な ID のリストを提供します。

SELECT TOP 5 WorkflowEventProcessingID
FROM Master.WorkflowEventProcessing
WHERE ProcessingToken IS NULL
ORDER BY WorkflowEventProcessingId

ここに画像の説明を入力

この範囲の最小 (55034) ID と最大 (55038) ID を 1 つの select ステートメントで取得する方法はありますか?

UPDATE WorkflowEventProcessing
SET ProcessingToken = <guid here>
WHERE WorkflowEventProcessingId >= @minId
  AND  WorkflowEventProcessingId <= @maxId

私はこのようなことを試しましたが、私は道を外れています:

DECLARE @minId INT
DECLARE @maxId INT

SELECT TOP 5 @minId = min(WorkflowEventProcessingID), @maxId = MAX(WorkflowEventProcessingID)
FROM Master.WorkflowEventProcessing
WHERE ProcessingToken IS NULL
ORDER BY WorkflowEventProcessingId

編集

これでデッドロックが発生しているため、サブ SELECT で UPDATE を実行したくありません。そのため、UPDATE と SELECT の間で別の DELETE プロセスを実行できるように、SELECT と UPDATE を分離するように言われました。

4

3 に答える 3

1

範囲の代わりにサブクエリを使用することを検討してください。

UPDATE  WorkflowEventProcessing
SET     ProcessingToken = <guid here>
WHERE   WorkflowEventProcessingId in
        (
        SELECT  TOP 5 WorkflowEventProcessingID
        FROM    Master.WorkflowEventProcessing with (updlock, holdlock)
        WHERE   ProcessingToken IS NULL
        ORDER BY 
                WorkflowEventProcessingId
        )
于 2012-08-17T15:04:01.743 に答える
1

試す

DECLARE @min INT
DECLARE @max INT

select @min = min(WorkflowEventProcessingID), 
       @max = max(WorkflowEventProcessingID)
from (
        SELECT TOP 5 WorkflowEventProcessingID
        FROM Master.WorkflowEventProcessing
        WHERE ProcessingToken IS NULL
        ORDER BY WorkflowEventProcessingId
     ) x

その後

UPDATE WorkflowEventProcessing
SET ProcessingToken = <guid here>
WHERE WorkflowEventProcessingId between @min and @max
于 2012-08-17T15:04:25.660 に答える
0

このようにする方が簡単ではないでしょうか?:

UPDATE WorkflowEventProcessing
SET ProcessingToken = <guid here>
WHERE WorkflowEventProcessingId IN (SELECT TOP 5 WorkflowEventProcessingID
FROM Master.WorkflowEventProcessing
WHERE ProcessingToken IS NULL
ORDER BY WorkflowEventProcessingId)

SELECT上でa を使用できないというコメントを見てUPDATE(使用できない理由はよくわかりませんが)、SQL Server 2005 以降を想定して、次のことを試すことができます。

;WITH CTE AS
(
    SELECT TOP 5 WorkflowEventProcessingID
    FROM Master.WorkflowEventProcessing
    WHERE ProcessingToken IS NULL
    ORDER BY WorkflowEventProcessingId
)
UPDATE CTE 
SET ProcessingToken = <guid here>
于 2012-08-17T15:05:38.787 に答える