2012-08-17 148 views
0

下面的查詢會給我的ID列表我需要運行此之後立即執行更新:獲取範圍的最小值和最大值

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

enter image description here

有沒有辦法讓分(55034)和最大值(55038)這個範圍的ID,在一個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。所以我被告知將SELECT和UPDATE分開,給單獨的DELETE進程一個在UPDATE和SELECT之間運行的機會。

+0

關於編輯和死鎖。你是否嘗試過把(nolock)放在你的子選擇上? – Paparazzi 2012-08-17 15:16:44

+0

您是否嘗試過'SELECT' /'INTO'到臨時表來緩衝您想要處理的ID?或者創建一個表變量並使用'INSERT' /'SELECT'來實現相同的目的? – HABO 2012-08-17 15:19:58

回答

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 
+0

這看起來像我想要的,但它不解析時,我嘗試了它:錯誤的語法附近' )' – 2012-08-17 15:14:02

+0

嗯。這個對我有用。 – 2012-08-17 15:16:07

+0

請參閱[本示例](http://sqlfiddle.com/#!3/2bc66/2) – 2012-08-17 15:17:16

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 
     ) 
+0

這實際上是我原來的,但我不能在where子句中進行選擇。看我的編輯。對不起,應該有那裏在第一個地方... – 2012-08-17 15:07:32

+0

一個死鎖通常可以通過'updlock'提示來避免 – Andomar 2012-08-17 15:22:45

0

那豈不是更容易?:

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

好了,看到你的評論,你不能在UPDATE使用SELECT(雖然我真的不明白爲什麼你不能),並假設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> 
+0

@BobHorn - 我更新了我的答案,以解決您的新限制,看看它是否有幫助 – Lamak 2012-08-17 15:13:15

+0

那麼這兩個單獨的SQL調用?這會給DELETE過程一個在它們之間運行的機會嗎? – 2012-08-17 15:19:40

+0

所以,這裏是問題......我不知道這是否比juergen的答案更好。這個答案很好,但是我的目標是我需要一個不會因爲同時運行的刪除過程而死鎖的東西。 – 2012-08-17 15:29:48

相關問題