【发布时间】:2019-02-13 16:37:13
【问题描述】:
我正在尝试对表进行非常简单的更新,我想在一个大表中用一个字符串替换另一个字符串。我正在尝试分批进行,因为该表有数亿行。
但是我需要根据那里的内容不同地替换字符串,但仍然满足批号在最新时间戳中的要求。
我不想分别运行 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 表达式吗?
-
您并没有真正详细地描述您的业务逻辑。你能告诉我们更多你的意思吗:
I need to replace the string differently depending on what was there -
小心,如果新的更新值与之前的旧值重叠,那么它永远不会完成。如果没有,CASE 可以解决替换问题。
标签: sql sql-server performance sql-update