To avoid locking a table for a damn long time, this is how Google told me to do mass copies of data in Microsoft SQL Server:
DECLARE @BatchSize INT = 1000 DECLARE @IdMax INT = 25179272 DECLARE @i INT = 0 WHILE @i <= @IdMax BEGIN INSERT INTO [mydata].[dbo].[ProjectEventValues] WITH (TABLOCK) ([projectId] ,[descId] ,[index] ,[controllerId] ,[timestamp] ,[value]) SELECT s.projectId, s.descId, s.[index], s.controllerId, s.[timestamp], s.value FROM [mydata].[dbo].[ProjectEventValues_temp]s WHERE s.eventId >= @i AND s.eventId < (@i+@BatchSize) SET @i = @i + @BatchSize PRINT @i END GO
Here for future reference.
..and another one, for personal reference:
USE [mydata] GO DECLARE @PID uniqueidentifier DECLARE @i int = 0 DECLARE cur CURSOR LOCAL FOR SELECT projectId FROM Projects WHERE deleted IS NULL OPEN cur FETCH NEXT FROM CUR INTO @PID WHILE @@FETCH_STATUS = 0 BEGIN PRINT @i PRINT @PID SET @i = @i + 1 INSERT INTO [mydata].[dbo].[ProjectEventValues.new] WITH (TABLOCK) ([projectId] ,[descId] ,[index] ,[controllerId] ,[timestamp] ,[value] ,[aggregated]) SELECT s.projectId, s.descId, s.[index], s.controllerId, s.[timestamp], s.value, 0 FROM [mydata].[dbo].[ProjectEventValues]s WHERE s.projectId = @PID AND s.timestamp >= '2015-03-04' AND s.timestamp < '2015-03-05' FETCH NEXT FROM CUR INTO @PID END
Yeh.