我正在尝试定期更新大约25条记录。为此,我有5个作业,它们定期执行一个过程。该过程的结果如下所示。
UPDATE
TOP 5
FooTable
SET
col2 = 'taxi'
OUTPUT
col1
WHERE
col2 = 'uber'如果这5个作业调用此存储过程( SP ),则每个SP将锁定其他SP的数据,并且前25条记录最终将被更新。
第2个作业中的SP是否可以使用一些锁定粒度或提示来选择下一个前5行,而不是等待前一个SP完成?
发布于 2017-09-25 13:41:17
下面的方法将会起作用。
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 );https://stackoverflow.com/questions/46397936
复制相似问题