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

 


Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *