如何基于SQL中的原始值进行更新

如何基于SQL中的原始值进行更新,sql,sql-server,performance,sql-update,Sql,Sql Server,Performance,Sql Update,我正在尝试对表进行一个非常简单的更新,我想用一个字符串替换一个大表中的另一个字符串。我正在尝试分批执行,因为表中有数亿行 但是我需要根据存在的内容以不同的方式替换字符串,但仍然满足批次号位于最新时间戳中的要求 我不想分别运行5个不同的脚本 我已经做到了这一步,但我不知道如何根据最初的情况正确应用更新 关于如何有效地做这件事有什么想法吗 DECLARE @batchsize bigint = 1000; WHILE 1 = 1 BEGIN UPDATE TOP (@batchsize)

我正在尝试对表进行一个非常简单的更新,我想用一个字符串替换一个大表中的另一个字符串。我正在尝试分批执行,因为表中有数亿行

但是我需要根据存在的内容以不同的方式替换字符串,但仍然满足批次号位于最新时间戳中的要求

我不想分别运行5个不同的脚本

我已经做到了这一步,但我不知道如何根据最初的情况正确应用更新

关于如何有效地做这件事有什么想法吗

DECLARE @batchsize bigint = 1000;

WHILE 1 = 1
BEGIN
    UPDATE TOP (@batchsize) Table1
    SET Row1 = 'To1'  -- want to set To2, To3, To4, To5, etc. depending on what was in there already
    FROM (SELECT TOP (@batchsize) Id
    FROM Table1 
    ORDER BY TimeStamp DESC) tto
    WHERE Table1.Row1 in ('From1', 'From2', 'From3', 'From4', 'From5') AND Table1.Id = tto.Id;

    if @@ROWCOUNT < @batchsize
    BEGIN
        PRINT('All Done');
        BREAK;
    END;
END;

您只是在寻找一个case表达式吗

   UPDATE TOP (@batchsize) Table1
     SET Row1 = (CASE table1.Row1
                     WHEN 'From1' THEN 'To1'
                     WHEN 'From2' THEN 'To2'
                     WHEN 'From3' THEN 'To3'
                     WHEN 'From4' THEN 'To4'
                     WHEN 'From5' THEN 'To5'
                 END)
     FROM (SELECT TOP (@batchsize) Id
           FROM Table1 
           ORDER BY TimeStamp DESC
          ) tto
     WHERE Table1.Row1 in ('From1', 'From2', 'From3', 'From4', 'From5') AND
           Table1.Id = tto.Id;

似乎这样就可以了:

SET Row1 = CASE 
  WHEN Row1 = 'From1' THEN 'To1' 
  WHEN Row1 = 'From2' THEN 'To2' 
  etc
END

示例数据和期望的结果会有所帮助。是否有什么原因使您不能使用案例表达式?您没有足够详细地描述您的业务逻辑。你能告诉我们更多关于你的意思吗:我需要根据当时的情况以不同的方式替换字符串小心,如果新更新的值与以前的旧值重叠,那么它将永远不会完成。如果没有,案例可以解决替换问题。