我正在尝试定期更新大约25条记录。为此,我有5个作业定期执行一个程序。程序就是这样的。
UPDATE
TOP 5
FooTable
SET
col2 = 'taxi'
OUTPUT
col1
WHERE
col2 = 'uber'
如果5个作业调用此存储过程(SP),则每个SP都会锁定其他SP的数据,并且前25个记录最终会更新。
来自第二个作业的SP是否能够获得具有一些锁定粒度或提示的下一个TOP 5行,而不是等待之前的SP完成?
答案 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 );