我如何同时更新TOP N记录

时间:2017-09-25 05:05:05

标签: sql sql-server

我正在尝试定期更新大约25条记录。为此,我有5个作业定期执行一个程序。程序就是这样的。

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

如果5个作业调用此存储过程(SP),则每个SP都会锁定其他SP的数据,并且前25个记录最终会更新。

来自第二个作业的SP是否能够获得具有一些锁定粒度或提示的下一个TOP 5行,而不是等待之前的SP完成?

1 个答案:

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