Fill a table with million row FAST

Last updated:

Warning: Review and test in a non-production environment before running.

Back to results

IF OBJECT_ID('dbo.GetNums') IS NOT NULL DROP FUNCTION dbo.GetNums;
GO

CREATE FUNCTION dbo.GetNums(@n AS BIGINT) RETURNS TABLE
AS
RETURN
  WITH
  L0   AS(SELECT 1 AS c UNION ALL SELECT 1),
  L1   AS(SELECT 1 AS c FROM L0 AS A CROSS JOIN L0 AS B),
  L2   AS(SELECT 1 AS c FROM L1 AS A CROSS JOIN L1 AS B),
  L3   AS(SELECT 1 AS c FROM L2 AS A CROSS JOIN L2 AS B),
  L4   AS(SELECT 1 AS c FROM L3 AS A CROSS JOIN L3 AS B),
  L5   AS(SELECT 1 AS c FROM L4 AS A CROSS JOIN L4 AS B),
  Nums AS(SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS n FROM L5)
  SELECT n FROM Nums WHERE n <= @n;
GO


-- To return 10 numbers you would simply pass the value 10 as input:

SELECT n FROM dbo.GetNums(10) AS Nums;

-----------------------------------------------------------------------------------------

IF OBJECT_ID('dbo.t1') IS NOT NULL  DROP TABLE dbo.t1 ; 

CREATE TABLE dbo.t1  ( i INT ,    
                       t TEXT ,    
                       c1 INT DEFAULT CHECKSUM(NEWID()) ,    
                       c2 INT DEFAULT CHECKSUM(NEWID())  
                     ) ; 

INSERT  INTO dbo.t1  ( i , t  )        
SELECT  n ,                
        REPLICATE('X', 200 + ( CHECKSUM(NEWID()) % 10 ))        
  FROM  dbo.GetNums(1000000) ;

select * from dbo.t1