更新SQL SQL Server

更新SQL SQL Server,sql,sql-server,Sql,Sql Server,我需要更改表中列的值,因此我需要执行以下操作: update members set frequence = 1 where frequence <> 1 我有700万行受到影响,我需要批量更新100000行,然后休眠2分钟,以便复制到其他数据库 请问我怎么做 Regrads这是一种比较常见的方法,尽管通常用于: DECLARE @hasRows BIT = 1 WHILE @hasRows = 1 BEGIN UPDATE TOP (100000) members

我需要更改表中列的值,因此我需要执行以下操作:

update members
set frequence = 1
where frequence <> 1
我有700万行受到影响,我需要批量更新100000行,然后休眠2分钟,以便复制到其他数据库

请问我怎么做


Regrads

这是一种比较常见的方法,尽管通常用于:

DECLARE @hasRows BIT = 1
WHILE @hasRows = 1
BEGIN
    UPDATE TOP (100000) members
    SET frequence=1
    WHERE frequence<>1
    IF @@ROWCOUNT = 0 SET @hasRows = 0

    WAITFOR DELAY '00:02'
END
如果需要按顺序执行,请按如下方式执行:

SET NOCOUNT ON;
DECLARE @r INT;
SET @r = 1;

WHILE @r > 0
BEGIN
    BEGIN TRANSACTION;

    ;with CTE as (
        select top 100000 *
        from members
        where frequence <> 1
        order by member_id
    )
    update CTE
    set frequence = 1

    SET @r = @@ROWCOUNT;

    COMMIT TRANSACTION;

    WAITFOR DELAY '00:02'

    -- To limit log activity:
    -- CHECKPOINT;    -- if simple
    -- BACKUP LOG ... -- if full
END

我想你应该看看Micheal J.Schwartz关于这个主题的文章:


如果您不使用memberId进行筛选,您可能会在扫描过程结束时扫描整个表,因为频率不是很有选择性。

您是否有任何列来确定顺序?是的,我有一个memberId,因为您一次更新超过5000行,由于SQL Server执行锁升级以处理大量锁,您将产生表级独占锁,这意味着在更新事务运行时,其他读取器甚至无法从该表中读取…字体结尾是否需要逻辑?您使用的是哪种编程语言?如果@ROWCOUNT=0 SET@hasRows=0,则应为为什么添加事务?米哈伊洛巴诺夫:不,在这种情况下不是。它之所以存在,主要是因为我抄袭的东西。IMX,若你们计划使用它来限制日志使用,那个么这是必要的,否则检查点可能无法正常工作。哈!Micheal J.Schwartz我爱死它了!谢谢你的插拔
SET NOCOUNT ON;
DECLARE @r INT;
SET @r = 1;

WHILE @r > 0
BEGIN
    BEGIN TRANSACTION;

    ;with CTE as (
        select top 100000 *
        from members
        where frequence <> 1
        order by member_id
    )
    update CTE
    set frequence = 1

    SET @r = @@ROWCOUNT;

    COMMIT TRANSACTION;

    WAITFOR DELAY '00:02'

    -- To limit log activity:
    -- CHECKPOINT;    -- if simple
    -- BACKUP LOG ... -- if full
END