none
creazione al volo tabella con numeri progressivi o date RRS feed

  • Domanda

  • ciao,
    come posso creare al volo una tabella che contiene per esempio i numeri da 1 a 100 o per esempio gli ultimi 10gg rispetto alla data di oggi, in modo che poi la possa mettere in join con altre mie tabelle?

    grazie,
    marco bosco
    lunedì 8 febbraio 2010 16:00

Risposte

  • Ciao Marco,
    una delle soluzioni potrebbe essere:
    WITH T AS
    (SELECT CONVERT(Datetime,CONVERT(CHAR(8),GETDATE(),112)) AS Giorno
     UNION ALL
     SELECT Giorno-1
     FROM   T
     WHERE Giorno > GETDATE()-9
    )
    SELECT * FROM T

    Ciao
    Giorgio Rancati
    • Contrassegnato come risposta marcobosco lunedì 18 aprile 2011 14:00
    lunedì 8 febbraio 2010 19:40
    Moderatore

Tutte le risposte

  • set nocount on

    use tempdb

    -- Creo una tabella temporanea
    Create table #myTable
     ( myDate smalldatetime
     )
    declare @i int
    set @i = 1

    -- Aggiungo i 10 giorni precedenti ad oggi
    while @i < 10
     begin
      set @i = @i+1
      insert into #mytable (myDate) values(dateadd(d,-1*@i, getdate())) --(dateadd(d,@i, getdate())
     end

    -- Recupero i dati della tabella temporanea
    select * from #myTable

    -- Elimino la tabella
    drop table #mytable


    -- Sandro Bizioli http://blogs.dotnethell.it/sandro/
    lunedì 8 febbraio 2010 17:59
  • Ciao Marco,
    una delle soluzioni potrebbe essere:
    WITH T AS
    (SELECT CONVERT(Datetime,CONVERT(CHAR(8),GETDATE(),112)) AS Giorno
     UNION ALL
     SELECT Giorno-1
     FROM   T
     WHERE Giorno > GETDATE()-9
    )
    SELECT * FROM T

    Ciao
    Giorgio Rancati
    • Contrassegnato come risposta marcobosco lunedì 18 aprile 2011 14:00
    lunedì 8 febbraio 2010 19:40
    Moderatore
  • come posso creare al volo una tabella che contiene per esempio i numeri da 1 a 100

    Ciao Marco,

    Per quanto riguarda la prima domanda ti mostro una UDF Tabled-Valued creata da Itzik che è di una eleganza ed efficienza da brividi :-D

    USE tempdb;
    GO
    
    /* Funzione di generazione numeri interi fino ad un max di 256 */
    CREATE FUNCTION dbo.GetNums(@n AS BIGINT) RETURNS TABLE
    AS
    RETURN
      WITH
      L0   AS(SELECT 1 AS c UNION ALL SELECT 1),
      L1   AS(SELECT 1 AS c FROM L0 AS A CROSS JOIN L0 AS B),
      L2   AS(SELECT 1 AS c FROM L1 AS A CROSS JOIN L1 AS B),
      L3   AS(SELECT 1 AS c FROM L2 AS A CROSS JOIN L2 AS B),
      Nums AS(SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS n FROM L3)
      SELECT TOP (@n) n FROM Nums ORDER BY n;
    GO
    
    SELECT *
    FROM dbo.GetNums(10);
    
    /* Output:
    
    n
    --------------------
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    (10 row(s) affected)
    
    */
    
    DROP FUNCTION dbo.GetNums;
    Per quanto riguarda la seconda domanda trovo la soluzione di Giorgio molto intrigante.
    Ti posto una piccola modifica valida per SQL Server 2008 che permette di eliminare il doppio cast utilizzato da Giorgio per eliminare la parte oraria dal risultato della funzione GETDATE():

    WITH T AS
    (
        SELECT CAST(CURRENT_TIMESTAMP AS date) AS Giorno
        UNION ALL
        SELECT DATEADD(day, -1, Giorno)
        FROM T
        WHERE Giorno > CURRENT_TIMESTAMP - 9
    )
    SELECT * 
    FROM T;
    

    Ciao!
    Lorenzo Benaglia
    Microsoft MVP - SQL Server
    http://blogs.dotnethell.it/lorenzo
    http://social.microsoft.com/Forums/it-IT/sqlserverit
    lunedì 8 febbraio 2010 20:44
    Moderatore
  • Per quanto riguarda la prima domanda ti mostro una UDF Tabled-Valued creata da Itzik che è di una eleganza ed efficienza da brividi :-D
    mitica!!, con 6 cte puoi raggiungere 4294967296 righe, la cosa notevole sono i tempi di esecuzione, 1.000.000 righe vengono rese in pochi secondi.
    l'ho semper dì che l'è mat!
    :-D
    Giorgio Rancati
    lunedì 8 febbraio 2010 21:25
    Moderatore