我在做一个表是非常简单的一排的MS SQL Server更新。我和另外4件事情更换约4事情。
update Table set Column1 = 'something new' where Column1 = 'something old';
update Table set Column1 = 'something new 2' where Column1 = 'something old 2';
update Table set Column1 = 'something new 3' where Column1 = 'something old 3';
update Table set Column1 = 'something new 4' where Column1 = 'something old 4';
这真的就是这么简单。但我的问题是,这是在生产运行记录数量庞大的表,但确切的数字是运行更新之前未知。有一个时间戳列。而且它可能更重要的是先更新最新的。
但我的问题可能是一个更prectical之一。
它是最好的时间戳来划分这件事,让它手动运行,还是有让这个运行的更好的方法?我还可以划分每个更新语句的工作。
或者是有一些办法可以把这样的事情到脚本本身?
我试图寻找的查询计划,但它并没有告诉我拆它的最佳途径。
您可以更新数据,使用while循环和更新顶部的选项块:
WHILE 1 = 1
BEGIN
UPDATE top (1000) tableToUpdate
SET Column1 = 'something new'
WHERE
Column1 = 'something old';
if @@ROWCOUNT < 1000 BREAK
END
当@@ROWCOUNT
小于1000
这是块的大小这意味着所有行被更新。
需要注意的是,根据官方文档:
在TOP表达式中引用的行用于与插入,更新,或删除不设置在任何顺序。
如果您正在寻找基于时间戳更新排序的数据,官方文档中,他们提到:
如果必须使用TOP以一种有意义的年表应用更新,必须在一个子查询语句中使用TOP连同ORDER BY。
如实施例:
WHILE 1 = 1
BEGIN
UPDATE tableToUpdate
SET Column1 = 'something new'
FROM (SELECT TOP 1000 IDColumn FROM tableToUpdate WHERE tableToUpdate.Column1 = 'something old' ORDER BY TimeStamp DESC) tto
WHERE
tableToUpdate.ID = tto.ID;
if @@ROWCOUNT < 1000 BREAK
END