Av en slump var jag tvungen att göra något väldigt liknande för ca 3 timmar sedan. Bordet var 35 m rader, det är ganska brett och det tog en evighet att bara göra det här:
alter table myTable add myNewColumn int not null default 0;
Det här är vad jag slutade med:
alter table myTable add myNewColumn int null;
while 1=1
begin
update top (100000) myTable
set
myNewColumn = 0
where
myNewColumn is null;
if @@ROWCOUNT = 0 break;
end
alter table myTable alter column myNewColumn int not null;
alter table myTable add constraint tw_def_myNewColumn default (0) for myNewColumn;
Den här gången, alter table
uttalanden var nästan omedelbara. Det tog cirka 7-8 minuter (på en långsam server) att göra uppdateringsbatcherna. Jag spekulerar i att SQL Server genererade ångra i min ursprungliga fråga för att återställa värdena, men jag förväntade mig inte att det började.
Hur som helst, i ditt fall kanske något liknande skulle hjälpa. Du kan prova att lägga till en ny bigint-kolumn, uppdatera den nya kolumnen i omgångar och sedan ställa in begränsningarna för den.