以下查询将为我提供运行此操作后立即执行更新所需的ID列表:
SELECT TOP 5 WorkflowEventProcessingID
FROM Master.WorkflowEventProcessing
WHERE ProcessingToken IS NULL
ORDER BY WorkflowEventProcessingId
有没有办法在一个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进程提供机会。
答案 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>