If you do not want to use recursive cte or have a table of numbers, you can use master..spt_values to generate your numbers for you:
declare @t table(Col1 nvarchar(1), Col2 int); insert into @t values ('A',2),('B',3),('C',4),('D',2),('E',1),('F',0); with rn as ( -- This sub select simply makes sure you only get the maximum number required. select top (select max(Col2) from @t) row_number() over (order by (select null)) as rn from master..spt_values t1 cross join master..spt_values t2 ) select t.Col1 from @tt inner join rn on(t.Col2 >= rn.rn) order by t.Col1
source share