2017-09-25 20 views
2

我正在嘗試定期更新一些25條記錄。爲此,我有5個作業定期執行程序。程序做了這樣的事情。我將如何同時更新TOP N記錄

UPDATE 
    TOP 5 
    FooTable 
SET 
    col2 = 'taxi' 
OUTPUT 
    col1 
WHERE 
    col2 = 'uber' 

如果晚五組的工作叫這個存儲過程(SP),每個SP會鎖定其他SP的數據和排名前25位的記錄會被最終更新。

第二項工作中的SP能否通過一些鎖定粒度或提示選擇下一個TOP 5行,而不是等待先前的SP完成?

+0

爲什麼你需要這個存儲過程?你可以通過運行簡單的查詢來完成它。有什麼特別的理由 –

+0

通過做你所問的問題可能導致骯髒閱讀 –

+0

@UsmanRana我已經相當簡化我原來的問題到這種狀態。我處於通過從多個實例上運行的作業調用的SP強制執行查詢的情況。我注意到TOP 5記錄中的這些UPDATE查詢將會等待其他前面TOP 5記錄的UPDATE查詢,這些查詢是完全不同的。所以我在考慮是否可以優化SP來直接讀取和更新下一個TOP 5記錄,而不是等待。 –

回答

0

下面的工作......

IF OBJECT_ID('tempdb..#TestData', 'U') IS NOT NULL 
DROP TABLE #TestData; 
GO 
CREATE TABLE #TestData (
    ID INT, 
    col2 INT 
    ); 
INSERT #TestData (ID, col2) 
SELECT 
    t.n, c.Col2 
FROM 
    dbo.tfn_Tally(200, 1) t 
    CROSS APPLY (VALUES (ABS(CHECKSUM(NEWID())) % 10 + 1)) c (Col2); 

--========================================================================================= 

-- before update values 
SELECT 
    td.ID, td.col2, 
    COUNT(1) OVER (PARTITION BY td.col2) 
FROM 
    #TestData td 
WHERE 
    td.col2 IN (3, 5); 

---------------------------------------------- 

WITH 
    cte_Top5 AS (
     SELECT TOP 5 
      td.Col2 
     FROM 
      #TestData td 
     WHERE 
      td.col2 = 5 
     ORDER BY 
      td.ID -- change this to determine which 5 are the top 5, or remove the ORDER BY all together if you don't care and save the sort expense. 
     ) 
UPDATE t5 SET 
    t5.Col2 = 3 
FROM 
    cte_Top5 t5; 

---------------------------------------------- 

-- after update values 
SELECT 
    td.ID, td.col2, 
    COUNT(1) OVER (PARTITION BY td.col2) 
FROM 
    #TestData td 
WHERE 
    td.col2 IN (3, 5); 
相關問題