SQL Server中多列的条件批量更新

SQL Server中多列的条件批量更新,sql,sql-server,tsql,Sql,Sql Server,Tsql,我试图更新几十万行,其中两列有一个特定值('xxx') 我需要分批进行,以避免完全锁定表。目前,我的查询如下所示 SET NOCOUNT ON; DECLARE @rows INT, @count INT, @message VARCHAR(100); SET @rows = 1; SET @count = 0; WHILE @rows > 0 BEGIN BEGIN TRAN UPDATE TOP (2000) people SET firs

我试图更新几十万行,其中两列有一个特定值('xxx')

我需要分批进行,以避免完全锁定表。目前,我的查询如下所示

SET NOCOUNT ON;
DECLARE @rows INT, @count INT, @message VARCHAR(100);
SET @rows = 1;
SET @count = 0;

WHILE @rows > 0
BEGIN
    BEGIN TRAN
         UPDATE TOP (2000) people
         SET firstname= CASE firstname WHEN 'xxx' THEN 'N/A' ELSE firstname  END,
         lastname= CASE lastname WHEN 'xxx' THEN 'N/A' ELSE lastname END

        SET @rows = @@ROWCOUNT
        SET @count = @count + @rows
        RAISERROR('COUNT %d', 0, 1, @count) WITH NOWAIT
    COMMIT TRAN
END

但我担心此查询的性能,或者更新这些列是否比使用case更容易。

我看不出同时更新两列的价值,因此我建议这样做:

update people
    set firstname = 'N/A'
    where firstname = 'XXX';

update people
    set lastname = 'N/A'
    where lastname = 'xxx';
如果要将这些内容放入循环中,则可以重复:

declare @reccnt int;
set @reccent = 1;

while @reccnt > 0
begin
    update top (2000) people
        set firstname = 'N/A'
        where firstname = 'XXX';

    set @reccnt = @@ROWCOUNT;
end;

以及姓氏。

添加
其中firstname='xxx'或lastname='xxx'
以减小写入集大小。为什么这样做?为什么不用
WHERE
?那么您就不会更新数千行了。如果
firstname
lastname
索引良好,则需要更新的行数将少得多。
CASE
表达式不是问题所在,而是缺少
WHERE
。顺便说一句,我用NULL代替“N/a”或“xxx”。当遇到实际错误时会发生什么?你的代码一直在继续。。。2000批似乎太少了。你担心——但为什么?您终止了一些语句,但在您的循环中没有一个语句。作为SQL的新手,不知怎的,我认为同时更新两个列会更有效,而不是再次遍历表。我认为这个答案最有意义。
declare @reccnt int;
set @reccent = 1;

while @reccnt > 0
begin
    update top (2000) people
        set firstname = 'N/A'
        where firstname = 'XXX';

    set @reccnt = @@ROWCOUNT;
end;