首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何并发更新前N条记录

我如何并发更新前N条记录
EN

Stack Overflow用户
提问于 2017-09-25 13:05:05
回答 1查看 71关注 0票数 2

我正在尝试定期更新大约25条记录。为此,我有5个作业,它们定期执行一个过程。该过程的结果如下所示。

代码语言:javascript
复制
UPDATE
    TOP 5
    FooTable
SET
    col2 = 'taxi'
OUTPUT
    col1
WHERE
    col2 = 'uber'

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

第2个作业中的SP是否可以使用一些锁定粒度或提示来选择下一个前5行,而不是等待前一个SP完成?

EN

回答 1

Stack Overflow用户

发布于 2017-09-25 13:41:17

下面的方法将会起作用。

代码语言:javascript
复制
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 );
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46397936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档