Interesting.
Or old school:
select distinct Number from master.dbo.spt_values where number between 0 and 1000
Another one I have seen is:
;With CTE ( [Number] ) as (
select Number = '0'
union select Number = '1'
union select Number = '2'
union select Number = '3'
union select Number = '4'
union select Number = '5'
union select Number = '6'
union select Number = '7'
union select Number = '8'
union select Number = '9'
)
Select [Number]
from (
select [Number] = cast([3sp].[Number] + [2sp].[Number] + [1sp].[Number] as varchar(10))
from CTE as [1sp]
cross join CTE as [2sp]
cross join CTE as [3sp]
) as x
where [Number] between 0 and 1000
order by 1
But the best in a way is a tally table which can be indexed and used in a query plan.
A slight problem that you might have with a recursive CTE is that the ".....the MAXRECURSION option exceeds the allowed maximum of 32767"