Nachdem ich die oben vorgeschlagene Lösung ausprobiert habe, die für kleine bis mittelgroße Tabellen funktioniert.
-
Alle Abhängigkeitsansichten der LargeSourceTable
löschen
-
Sie können die Abhängigkeiten mithilfe von SQL Management Studio finden, indem Sie mit der rechten Maustaste auf die Tabelle klicken und "Abhängigkeiten anzeigen" auswählen
-
Benennen Sie die Tabelle um:
-
sp_rename 'LargeSourceTable', 'LargeSourceTable_Temp'; GO
-
Erstellen Sie die LargeSourceTable
erneut, fügen Sie jedoch jetzt einen Primärschlüssel mit allen Spalten hinzu, die die Duplikate definieren, und fügen Sie WITH (IGNORE_DUP_KEY = ON)
hinzu
-
Zum Beispiel:
CREATE TABLE [dbo].[LargeSourceTable] ( ID int IDENTITY(1,1), [CreateDate] DATETIME CONSTRAINT [DF_LargeSourceTable_CreateDate] DEFAULT (getdate()) NOT NULL, [Column1] CHAR (36) NOT NULL, [Column2] NVARCHAR (100) NOT NULL, [Column3] CHAR (36) NOT NULL, PRIMARY KEY (Column1, Column2) WITH (IGNORE_DUP_KEY = ON) ); GO
-
Erstellen Sie erneut die Ansichten, die Sie zuerst für die neu erstellte Tabelle gelöscht haben
-
Führen Sie nun das folgende SQL-Skript aus. Sie sehen die Ergebnisse in 1.000.000 Zeilen pro Seite. Sie können die Zeilenanzahl pro Seite ändern, um die Ergebnisse häufiger zu sehen.
-
Beachten Sie, dass ich das IDENTITY_INSERT
ein- und ausschalte, weil eine der Spalten eine automatisch inkrementierbare ID enthält, die ich ebenfalls kopiere
SET IDENTITY_INSERT LargeSourceTable ON DECLARE @PageNumber AS INT, @RowspPage AS INT DECLARE @TotalRows AS INT declare @dt varchar(19) SET @PageNumber = 0 SET @RowspPage = 1000000
select @TotalRows = count (*) from LargeSourceTable_TEMP
While ((@PageNumber - 1) * @RowspPage < @TotalRows )
Begin
begin transaction tran_inner
; with cte as
(
SELECT * FROM LargeSourceTable_TEMP ORDER BY ID
OFFSET ((@PageNumber) * @RowspPage) ROWS
FETCH NEXT @RowspPage ROWS ONLY
)
INSERT INTO LargeSourceTable
(
ID
,[CreateDate]
,[Column1]
,[Column2]
,[Column3]
)
select
ID
,[CreateDate]
,[Column1]
,[Column2]
,[Column3]
from cte
commit transaction tran_inner
PRINT 'Seite: ' + convert(varchar(10), @PageNumber)
PRINT 'Übertragen: ' + convert(varchar(20), @PageNumber * @RowspPage)
PRINT 'Von: ' + convert(varchar(20), @TotalRows)
SELECT @dt = convert(varchar(19), getdate(), 121)
RAISERROR('Eingefügt am: %s', 0, 1, @dt) WITH NOWAIT
SET @PageNumber = @PageNumber + 1
End
SET IDENTITY_INSERT LargeSourceTable OFF