What is the best way to create and populate a numbers table?

后端 未结 11 2685
悲&欢浪女
悲&欢浪女 2020-11-21 13:28

I\'ve seen many different ways to create and populate a numbers table. However, what is the best way to create and populate one? With \"best\" being defined from most to l

11条回答
  •  半阙折子戏
    2020-11-21 14:01

    I start with the following template, which is derived from numerous printings of Itzik Ben-Gan's routine:

    ;WITH
      Pass0 as (select 1 as C union all select 1), --2 rows
      Pass1 as (select 1 as C from Pass0 as A, Pass0 as B),--4 rows
      Pass2 as (select 1 as C from Pass1 as A, Pass1 as B),--16 rows
      Pass3 as (select 1 as C from Pass2 as A, Pass2 as B),--256 rows
      Pass4 as (select 1 as C from Pass3 as A, Pass3 as B),--65536 rows
      Pass5 as (select 1 as C from Pass4 as A, Pass4 as B),--4,294,967,296 rows
      Tally as (select row_number() over(order by C) as Number from Pass5)
     select Number from Tally where Number <= 1000000
    

    The "WHERE N<= 1000000" clause limits the output to 1 to 1 million, and can easily be adjusted to your desired range.

    Since this is a WITH clause, it can be worked into an INSERT... SELECT... like so:

    --  Sample use: create one million rows
    CREATE TABLE dbo.Example (ExampleId  int  not null)  
    
    DECLARE @RowsToCreate int
    SET @RowsToCreate = 1000000
    
    --  "Table of numbers" data generator, as per Itzik Ben-Gan (from multiple sources)
    ;WITH
      Pass0 as (select 1 as C union all select 1), --2 rows
      Pass1 as (select 1 as C from Pass0 as A, Pass0 as B),--4 rows
      Pass2 as (select 1 as C from Pass1 as A, Pass1 as B),--16 rows
      Pass3 as (select 1 as C from Pass2 as A, Pass2 as B),--256 rows
      Pass4 as (select 1 as C from Pass3 as A, Pass3 as B),--65536 rows
      Pass5 as (select 1 as C from Pass4 as A, Pass4 as B),--4,294,967,296 rows
      Tally as (select row_number() over(order by C) as Number from Pass5)
    INSERT Example (ExampleId)
     select Number
      from Tally
      where Number <= @RowsToCreate
    

    Indexing the table after it's built will be the fastest way to index it.

    Oh, and I'd refer to it as a "Tally" table. I think this is a common term, and you can find loads of tricks and examples by Googling it.

提交回复
热议问题