none
creare un ciclo per riempire una tabella RRS feed

  • Domanda

  • buongiorno a tutti.

    Ho una tabella "TbContatti"

    per fare dei test di prestazioni col mio programma, ho bisogno di avere questa tabella popolata con almeno 20.000 record.

    nel campo "RagioneSociale" dovrei avere testo diverso... andrebbe bene anche testo numerico per esempio da 1 a 20.000.

    Altra cosa che mi servirebbe è di avere il campo "DataNascita" diverso da tutti.

    Qualche suggerimento? Io non ho mai fatto cicli nelle query.


    Pranzo Stefano

    lunedì 12 agosto 2013 13:04

Risposte

  • Ciao

    penso perché inserisci un numero nel campo RagioneSociale (che penso sia un nvarchar) , senza convertirlo.

    se non ti interessa in contatore prova questa : 

    DECLARE @startDate DATETIME
    SET @startDate = '2000-01-01'
    
    DECLARE @counter BIGINT
    DECLARE @endCicle BIGINT
    SET @counter = 1
    SET @endCicle = 20000
    
    ;WITH GetRange(rowindex, Date) AS
    (
        SELECT
           @counter AS rowindex
           , @StartDate Date
        UNION ALL
        SELECT
            rowindex + 1 AS rowindex
            , DATEADD(day, 1, Date) Date
        FROM
            GetRange 
        WHERE
            rowindex < @endCicle
    )
    
    INSERT INTO [TbSoggetti]
    (RagioneSociale, DataNascita, NomeSoggetto)
    SELECT NEWID() AS RagioneSociale, Date, NEWID() AS NomeSoggetto
    FROM GetRange
    OPTION (MaxRecursion 0);

    ho tolto la generazione del nome dalla tabella ricorsiva, perché effettivamente lo si può fare anche solo nella insert.


    Luca Dalsass
    Solution Architect and Development Manager presso Totalcom Srl Bolzano

    • Contrassegnato come risposta Stefano Pranzo mercoledì 14 agosto 2013 10:55
    martedì 13 agosto 2013 06:43
  • l'errore si "data will be truncated" avviene quando inserisci dei dati in un campo di testo, per una lunghezza superiore al campo stesso.

    per ovviare a questo problema devi usare la funzione SUBSTRING : link

    esempio

    DECLARE @startDate DATETIME
    SET @startDate = '2000-01-01'
    DECLARE @counter BIGINT
    DECLARE @endCicle BIGINT
    SET @counter = 1
    SET @endCicle = 20000
    ;WITH GetRange(rowindex, Date) AS
    (
        SELECT
           @counter AS rowindex
           , @StartDate Date
        UNION ALL
        SELECT
            rowindex + 1 AS rowindex
            , DATEADD(day, 1, Date) Date
        FROM
            GetRange 
        WHERE
            rowindex < @endCicle
    )
    INSERT INTO [TbSoggetti]
    (RagioneSociale, DataNascita, NomeSoggetto)
    SELECT SUBSTRING(CONVERT(varchar(255), NEWID()), 0, <lunghezza campo>)
     AS RagioneSociale, Date, SUBSTRING( CONVERT(varchar(255), NEWID()), 0, <lunghezza campo>) AS NomeSoggetto
    FROM GetRange
    OPTION (MaxRecursion 0);


    Luca Dalsass
    Solution Architect and Development Manager presso Totalcom Srl Bolzano


    • Modificato shjonblake mercoledì 14 agosto 2013 08:36
    • Contrassegnato come risposta Stefano Pranzo mercoledì 14 agosto 2013 10:56
    mercoledì 14 agosto 2013 08:34
  • si. Grazie Shjonblake.. ho risolto col SUBSTRING:

    INSERT INTO [TbSoggetti]
    (RagioneSociale, DataNascita, NomeSoggetto)
    SELECT SUBSTRING ( CONVERT(varchar(45), NEWID()) ,0 , 200 )
     AS RagioneSociale, Date, SUBSTRING ( CONVERT(varchar(255), NEWID()) ,0 , 20 ) AS NomeSoggetto
    FROM GetRange
    OPTION (MaxRecursion 0);


    Pranzo Stefano

    • Contrassegnato come risposta Stefano Pranzo mercoledì 14 agosto 2013 10:57
    mercoledì 14 agosto 2013 10:57

Tutte le risposte

  • puoi fare in diversi modi.

    se hai un sql server 2005 o superiore puoi usare le CTE per fare un inserimento massivo.
    Non è la soluzione più semplice, lo ammetto, ma è un buon esercizio per testare le CTE di SQL server :) 

    DECLARE @startDate DATETIME
    SET @startDate = '2000-01-01'
    
    DECLARE @counter BIGINT
    DECLARE @endCicle BIGINT
    
    SET @counter = 1
    SET @endCicle = 20000
    
    
    
    ;WITH GetRange(rowindex, Date, NAME) AS
    (
        SELECT
           @counter AS rowindex
           , @StartDate Date
           , NEWID() AS Name
        UNION ALL
        SELECT
            rowindex + 1 AS rowindex
            , DATEADD(day, 1, Date) Date
            , NEWID() AS Name
        FROM
            GetRange 
        WHERE
            rowindex < @endCicle
    )
    
    INSERT INTO [mytable]
    (rowindex, Date, NAME)
    SELECT rowindex, Date, NAME
    FROM GetRange
    OPTION (MaxRecursion 0);

    In pratica viene costruita una tabella in memoria e poi vengono inseriti i record nella tua tabella di destinazione [mytable]. Le date partono da @startdate e aumentano di in giorno per ogni record. La ragione sociale le generi con la funzione newID() che genera ogni volta un Guid univoco.

    In alternativa puoi usare un ciclo while, facendo in inserimento alla volta:

    DECLARE @startDate DATETIME
    SET @startDate = '2000-01-01'
    
    DECLARE @counter BIGINT
    DECLARE @endCicle BIGINT
    
    SET @counter = 1
    SET @endCicle = 20000
        
    WHILE @counter < @endCicle
    BEGIN
    	INSERT INTO [mytable]
    	(rowindex, Date, NAME)
    	SELECT @counter, @startDate, NEWID()
    	
    	SET @startDate = DATEADD(day, 1, @startDate)
    	SET @counter = @counter + 1
    END
        

    Usa quello che ti viene più facile 


    Luca Dalsass
    Solution Architect and Development Manager presso Totalcom Srl Bolzano

    lunedì 12 agosto 2013 14:43
  • Grazie Luca...

    Molto interessante le tue Query.

    Sto provando ad usare la prima... ma mi genera questo errore:

    Msg 8115, Level 16, State 2, Line 10

    Arithmetic overflow error converting expression to data type nvarchar.

    The statement has been terminated.

    ti riporto il codice come l'ho modificato (ho modificato solo i valori della mia tabella)

    DECLARE @startDate DATETIME
    SET @startDate = '2000-01-01'
    
    DECLARE @counter BIGINT
    DECLARE @endCicle BIGINT
    SET @counter = 1
    SET @endCicle = 20000
    
    ;WITH GetRange(rowindex, Date, NAME) AS
    (
        SELECT
           @counter AS rowindex
           , @StartDate Date
           , NEWID() AS Name
        UNION ALL
        SELECT
            rowindex + 1 AS rowindex
            , DATEADD(day, 1, Date) Date
            , NEWID() AS Name
        FROM
            GetRange 
        WHERE
            rowindex < @endCicle
    )
    
    INSERT INTO [TbSoggetti]
    (RagioneSociale, DataNascita, NomeSoggetto)
    SELECT rowindex, Date, NAME
    FROM GetRange
    OPTION (MaxRecursion 0);

    Grazie

    Pranzo Stefano

    lunedì 12 agosto 2013 22:46
  • Ciao

    penso perché inserisci un numero nel campo RagioneSociale (che penso sia un nvarchar) , senza convertirlo.

    se non ti interessa in contatore prova questa : 

    DECLARE @startDate DATETIME
    SET @startDate = '2000-01-01'
    
    DECLARE @counter BIGINT
    DECLARE @endCicle BIGINT
    SET @counter = 1
    SET @endCicle = 20000
    
    ;WITH GetRange(rowindex, Date) AS
    (
        SELECT
           @counter AS rowindex
           , @StartDate Date
        UNION ALL
        SELECT
            rowindex + 1 AS rowindex
            , DATEADD(day, 1, Date) Date
        FROM
            GetRange 
        WHERE
            rowindex < @endCicle
    )
    
    INSERT INTO [TbSoggetti]
    (RagioneSociale, DataNascita, NomeSoggetto)
    SELECT NEWID() AS RagioneSociale, Date, NEWID() AS NomeSoggetto
    FROM GetRange
    OPTION (MaxRecursion 0);

    ho tolto la generazione del nome dalla tabella ricorsiva, perché effettivamente lo si può fare anche solo nella insert.


    Luca Dalsass
    Solution Architect and Development Manager presso Totalcom Srl Bolzano

    • Contrassegnato come risposta Stefano Pranzo mercoledì 14 agosto 2013 10:55
    martedì 13 agosto 2013 06:43
  • Il contatore non mi serve... ho un campo che si autoincrementa...

    ho modificato la tua Query dato che mi dava errore di conversione... ma ho un altro errore:

    DECLARE @startDate DATETIME
    SET @startDate = '2000-01-01'
    DECLARE @counter BIGINT
    DECLARE @endCicle BIGINT
    SET @counter = 1
    SET @endCicle = 20000
    ;WITH GetRange(rowindex, Date) AS
    (
        SELECT
           @counter AS rowindex
           , @StartDate Date
        UNION ALL
        SELECT
            rowindex + 1 AS rowindex
            , DATEADD(day, 1, Date) Date
        FROM
            GetRange 
        WHERE
            rowindex < @endCicle
    )
    INSERT INTO [TbSoggetti]
    (RagioneSociale, DataNascita, NomeSoggetto)
    SELECT CONVERT(varchar(255), NEWID())
     AS RagioneSociale, Date, CONVERT(varchar(255), NEWID()) AS NomeSoggetto
    FROM GetRange
    OPTION (MaxRecursion 0);

    Errore:

    Msg 8152, Level 16, State 4, Line 8

    String or binary data would be truncated.

    The statement has been terminated.


    Pranzo Stefano

    martedì 13 agosto 2013 21:37
  • l'errore si "data will be truncated" avviene quando inserisci dei dati in un campo di testo, per una lunghezza superiore al campo stesso.

    per ovviare a questo problema devi usare la funzione SUBSTRING : link

    esempio

    DECLARE @startDate DATETIME
    SET @startDate = '2000-01-01'
    DECLARE @counter BIGINT
    DECLARE @endCicle BIGINT
    SET @counter = 1
    SET @endCicle = 20000
    ;WITH GetRange(rowindex, Date) AS
    (
        SELECT
           @counter AS rowindex
           , @StartDate Date
        UNION ALL
        SELECT
            rowindex + 1 AS rowindex
            , DATEADD(day, 1, Date) Date
        FROM
            GetRange 
        WHERE
            rowindex < @endCicle
    )
    INSERT INTO [TbSoggetti]
    (RagioneSociale, DataNascita, NomeSoggetto)
    SELECT SUBSTRING(CONVERT(varchar(255), NEWID()), 0, <lunghezza campo>)
     AS RagioneSociale, Date, SUBSTRING( CONVERT(varchar(255), NEWID()), 0, <lunghezza campo>) AS NomeSoggetto
    FROM GetRange
    OPTION (MaxRecursion 0);


    Luca Dalsass
    Solution Architect and Development Manager presso Totalcom Srl Bolzano


    • Modificato shjonblake mercoledì 14 agosto 2013 08:36
    • Contrassegnato come risposta Stefano Pranzo mercoledì 14 agosto 2013 10:56
    mercoledì 14 agosto 2013 08:34
  • si. Grazie Shjonblake.. ho risolto col SUBSTRING:

    INSERT INTO [TbSoggetti]
    (RagioneSociale, DataNascita, NomeSoggetto)
    SELECT SUBSTRING ( CONVERT(varchar(45), NEWID()) ,0 , 200 )
     AS RagioneSociale, Date, SUBSTRING ( CONVERT(varchar(255), NEWID()) ,0 , 20 ) AS NomeSoggetto
    FROM GetRange
    OPTION (MaxRecursion 0);


    Pranzo Stefano

    • Contrassegnato come risposta Stefano Pranzo mercoledì 14 agosto 2013 10:57
    mercoledì 14 agosto 2013 10:57