在尝试上面提供的解决方法后,我发现这种方法适用于小中型表格。但是对于非常大的表格,我可以建议您使用另一种解决方案,因为它需要进行迭代。
以下是详细步骤:
- 删除所有与
LargeSourceTable
相关的依赖视图
- 您可以使用SQL管理工作室找到依赖项,右键单击表格,然后单击“查看依赖项”
- 重命名表格:
sp_rename 'LargeSourceTable','LargeSourceTable_Temp'; GO
- 重新创建
LargeSourceTable
,但现在要添加一个主键,将定义重复值的所有列添加WITH(IGNORE_DUP_KEY = ON)
例如:
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
再次创建您在第一步删除的视图以针对新创建的表格
现在,运行以下SQL脚本,您将在每页1,000,000行中看到结果,您可以更改每页的行数以更频繁地查看结果。
请注意,我设置了IDENTITY_INSERT
,因为其中一个列包含自动增量ID,我也正在复制它
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 'Page: ' + convert(varchar(10), @PageNumber)
PRINT 'Transfered: ' + convert(varchar(20), @PageNumber * @RowspPage)
PRINT 'Of: ' + convert(varchar(20), @TotalRows)
SELECT @dt = convert(varchar(19), getdate(), 121)
RAISERROR('Inserted on: %s', 0, 1, @dt) WITH NOWAIT
SET @PageNumber = @PageNumber + 1
End
SET IDENTITY_INSERT LargeSourceTable OFF