SQL Server中多列的条件批量更新
我试图更新几十万行,其中两列有一个特定值('xxx') 我需要分批进行,以避免完全锁定表。目前,我的查询如下所示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
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;