Principale utente con più risposte
creare un ciclo per riempire una tabella

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
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- blog : Diario di un programmatore
- blog : Videogioco troppo poco
- Contrassegnato come risposta Stefano Pranzo mercoledì 14 agosto 2013 10:55
-
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- blog : Diario di un programmatore
- blog : Videogioco troppo poco
- Modificato shjonblake mercoledì 14 agosto 2013 08:36
- Contrassegnato come risposta Stefano Pranzo mercoledì 14 agosto 2013 10:56
-
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
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- blog : Diario di un programmatore
- blog : Videogioco troppo poco
- Proposto come risposta NinoRCTNModerator mercoledì 14 agosto 2013 05:53
-
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);
GraziePranzo Stefano
-
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- blog : Diario di un programmatore
- blog : Videogioco troppo poco
- Contrassegnato come risposta Stefano Pranzo mercoledì 14 agosto 2013 10:55
-
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
-
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- blog : Diario di un programmatore
- blog : Videogioco troppo poco
- Modificato shjonblake mercoledì 14 agosto 2013 08:36
- Contrassegnato come risposta Stefano Pranzo mercoledì 14 agosto 2013 10:56
-
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