Tabelle di numeri (o di date) in SQL Server
Chi non ha mai avuto bisogno di un calendario o di una tabella di numeri ordinati in SQL?
Spesso si ricorre a una tabella fisica, creata apposta, nella quale inserire i record voluti; oggi me ne serviva una, ma non mi andava di crearla…
Questo che suggerisco è un metodo “on the fly” che sfrutta la tabella sys.all_objects:
select count(*)
from sys.all_objects
Nel mio DB questa tabella ha 18.000 elementi circa… 18.000 * 18.000 fa 324.000.000 che è un numero di numeri che per me è sufficiente:
select row_number() over (order by a.object_id, b.object_id) numero
from sys.all_objects a, sys.all_objects b
restituisce i numeri ordinati da 1 a 100.000 e può essere agevolmente usata in una query CTE:
with a as (
select top 100000 row_number() over (order by a.object_id, b.object_id) numero
from sys.all_objects a, sys.all_objects b
)
select <qualchecosa che usi a e altre tabelle>
Un’alternativa è la generazione di un calendario a oggi all’indietro per due anni, per esempio:
select top 730 dateadd(day, -row_number() over (order by a.object_id) + 1, CONVERT(date,getdate())) Giorno
from sys.all_objects a