Если производительность вашей заботы, есть эта UDF готова:
create function [dbo].[Numbers](@count bigint)
RETURNS TABLE RETURN
with byte (n) as (select 1 from (VALUES
(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
) x(n) )
, byte2 (n) as (select 1 from byte a, byte b)
, byte4 (n) as (select 1 from byte2 a, byte2 b)
, byte8 (n) as (select 1 from byte4 a, byte4 b)
select top(@count) n = ROW_NUMBER() over(order by n) from byte8
По-видимому, рекурсия только КТР сгенерированной порядковый номер работы, но очень медленно. Здесь мы продаем некоторый объем кода для огромного увеличения производительности. Это дает мне более 30 миллионов номеров за 8 секунд на моем дерьмовом перегруженном ПК. Он может зайти так далеко, как вы хотите, и может позволить себе предел максимума bigint.
Он не будет касаться диска IO, если оптимизатор не выберет его из памяти (вряд ли когда-либо для разумного сценария). Это также позволит избежать ожиданий и тупиков, в отличие от решений на основе физических таблиц.
Использование так:
select 2 + n*5 from Numbers(100)
Вы должны быть в состоянии создать представление, как это.
Для тех, кому не требуется фактическое число, просто строки, удаляющие материал row_number, ускоряют его дважды.
Вдохновленный http://weblogs.sqlteam.com/jamesn/archive/2008/05/29/60612.aspx (Ицик Бен Ган, упомянутый С. Нейманом). Эта версия поставляется с более простым планом выполнения и делает возможности возможными, вот о преимуществах.
Есть ли какая-то причина для этого в SQL, а не на уровне приложения? – Borealid
@Borealid - часто полезно иметь таблицу дополнительных номеров в SQL. –
@Borealid: Если бы я мог создать такую таблицу, то, я полагаю, я мог бы использовать ее для создания более сложных запросов; Если я сгенерировал его в приложении, я думаю, что застрял бы с супер длинными операторами SQL с последовательностью, встроенной в них. –