获得最小和最大范围

时间:2012-08-17 15:02:17

标签: sql-server tsql

以下查询将为我提供运行此操作后立即执行更新所需的ID列表:

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

enter image description here

有没有办法在一个select语句中获取此范围的min(55034)和max(55038)ID,所以我可以这样做:

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,因为我在这上面遇到了死锁。因此我被告知要将SELECT和UPDATE分开,以便为UPDATE和SELECT之间的单独DELETE进程提供机会。

3 个答案:

答案 0 :(得分: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
        )

答案 1 :(得分: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

答案 2 :(得分: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上使用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>