Рекурсивный подход CTE - это действительно хорошо.
Просто помните о разнице в производительности.Давайте поиграем с миллионом записей:
Рекурсивный подход CTE.Длительность = 14 секунд
declare @start int = 1;
declare @end int = 999999;
with numbers as
(
select @start as number
union all
select number + 1 from numbers where number < @end
)
select * from numbers option(maxrecursion 0);
Объединение All + Cross Join подход.Длительность = 6 секунд
with N(n) as
(
select 1 union all select 1 union all select 1 union all
select 1 union all select 1 union all select 1 union all
select 1 union all select 1 union all select 1 union all select 1
)
select top 999999
row_number() over(order by (select 1)) as number
from
N n1, N n2, N n3, N n4, N n5, N n6;
Конструктор табличных значений + метод перекрестного соединения.Длительность = 6 секунд
(если SQL Server> = 2008)
with N as
(
select n from (values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) t(n)
)
select top 999999
row_number() over(order by (select 1)) as number
from
N n1, N n2, N n3, N n4, N n5, N n6;
Рекурсивный подход CTE + перекрестное соединение.:) Продолжительность = 6 секунд
with N(n) as
(
select 1
union all
select n + 1 from N where n < 10
)
select top 999999
row_number() over(order by (select 1)) as number
from
N n1, N n2, N n3, N n4, N n5, N n6;
Мы получим более удивительный эффект, если попытаемся вставить результат в табличную переменную:
Вставить с помощьюРекурсивный подход CTE.Длительность = 17 секунд
declare @R table (Id int primary key clustered);
with numbers as
(
select 1 as number
union all
select number + 1 from numbers where number < 999999
)
insert into @R
select * from numbers option(maxrecursion 0);
INSERT INTO с подходом Cross Join.Продолжительность = 1 секунда
declare @C table (Id int primary key clustered);
with N as
(
select n from (values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) t(n)
)
insert into @C
select top 999999
row_number() over(order by (select 1)) as number
from
N n1, N n2, N n3, N n4, N n5, N n6;
Вот интересная статья о Tally Tables