2013-08-31 14 views
15

Ho fatto l'appliacazione Wpf. Voglio testarlo con 1000 valori nella griglia. Voglio verificare se la mia rete caricherà 1000 record di dati velocemente o meno. Quindi, come scrivere una query per inserire più di 1000 record nella tabella del mio database. posso usare per il ciclo.Come inserire 1000 righe alla volta

Insert into db(@names,@email,@password) Values('abc','def','mypassword');

sto utilizzando Sql-Server 2012 e ADO.net connettività! Io voglio eseguire la query nel database per generare 1000 righe

EDIT

E se voglio inserire nomi univoci?

+1

Come stai generando questi valori 1000? Stai utilizzando un DataTable per memorizzare i tuoi valori? Hai esaminato [SqlBulkCopy] (http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx)? In questo momento la tua domanda è troppo ampia perché ci sono molti modi per farlo a seconda dei dettagli che hai tralasciato. Per favore spiegate di più quali tecnologie state usando (ADO.NET, Entitiy Framework, NHibernate) e come state usando. –

+0

@ScottChamberlain Sì, sto usando la tabella di database chiamata 'db'. Vorrei scrivere una query per generare 1000 righe nella mia tabella. –

+0

@Zoya sta chiedendo da dove vengono i 1000 nomi. Stai cercando di generare 1000 nomi identici, 1000 nomi diversi (e se sì, come)? Hai già una lista di 1000 nomi? Definisci meglio la tua domanda per favore. –

risposta

29

Creare un tavolo student con tre colonne id, student,age. mostrare questo esempio

declare @id int 
select @id = 1 
while @id >=1 and @id <= 1000 
begin 
    insert into student values(@id, 'jack' + convert(varchar(5), @id), 12) 
    select @id = @id + 1 
end 

questo è il risultato sull'esempio enter image description here

+4

Qual è il motivo per avere '@id> = 1' nella clausola' while'? Penserei che solo '@id <= 1000' sarebbe necessario. – andrewb

3

Ovviamente si può utilizzare un ciclo, oppure è possibile inserire in una singola istruzione, per esempio

Insert into db 
(names,email,password) 
Values 
('abc','def','mypassword') 
,('ghi','jkl','mypassword2') 
,('mno','pqr','mypassword3') 

Dipende davvero da dove si ricevono i dati.

Se si utilizza un ciclo, il suo inserimento in una transazione lo renderà un po 'più veloce.

UPDATE

E se voglio inserire nomi univoci?

Se si desidera inserire nomi univoci, è necessario generare dati con nomi univoci. Un modo per farlo è utilizzare Visual Studio to generate test data.

+0

Cosa succede se voglio inserire nomi univoci? –

3

È possibile inserire più record inserendo da un risultato:

insert into db (@names,@email,@password) 
select 'abc','def','mypassword' union all 
select 'abc','def','mypassword' union all 
select 'abc','def','mypassword' union all 
select 'abc','def','mypassword' union all 
select 'abc','def','mypassword' union all 
select 'abc','def','mypassword' 

Basta aggiungere il maggior numero di record che ti piace. Tuttavia, potrebbero esserci delle limitazioni sulla complessità della query, quindi potrebbe non essere possibile aggiungere fino a 1000 record contemporaneamente.

+0

Posso usarlo per inserire nomi univoci nella colonna dei nomi? –

+0

@ZoyaSheikh: Sì, basta inserire nomi univoci nelle istruzioni di selezione. – Guffa

+0

non si ripeteranno? –

7

Se si dispone di un DataTable nell'applicazione, e qui si trovano i nomi 1000 da, è possibile utilizzare un parametro con valori di tabella per questo.

In primo luogo, un tipo di tabella:

CREATE TYPE dbo.Names AS TABLE 
(
    Name NVARCHAR(255), 
    email VARCHAR(320), 
    [password] VARBINARY(32) -- surely you are not storing this as a string!? 
); 

Poi una procedura per utilizzare questo:

CREATE PROCEDURE dbo.Names_BulkInsert 
    @Names dbo.Names READONLY 
AS 
BEGIN 
    SET NOCOUNT ON; 

    INSERT dbo.RealTable(Name, email, password) 
    SELECT Name, email, password 
    FROM @Names; 
END 
GO 

Allora il vostro codice C# può dire:

SqlCommand cmd = new SqlCommand("dbo.Names_BulkInsert", connection_object); 
cmd.CommandType = CommandType.StoredProcedure; 
SqlParameter names = cmd.Parameters.AddWithValue("@Names", DataTableName); 
names.SqlDbType = SqlDbType.Structured; 
cmd.ExecuteNonQuery(); 

Se si desidera solo per generare 1000 righe con valori casuali:

;WITH x AS 
(
    SELECT TOP (1000) n = REPLACE(LEFT(name,32),'_','') 
    FROM sys.all_columns ORDER BY NEWID() 
) 
-- INSERT dbo.sometable(name, email, [password]) 
SELECT 
    name = LEFT(n,3), 
    email = RIGHT(n,5) + '@' + LEFT(n,2) + '.com', 
    [password] = CONVERT(VARBINARY(32), SUBSTRING(n, 1, 32)) 
FROM x; 

In nessuno di questi casi si dovrebbe utilizzare durante loops o cursori. A PARER MIO.

1

Utilizzando un'idea @Aaron Bertrand (FROM sys.all_columns), questo è qualcosa che creerà 1000 record:

SELECT TOP (1000) LEFT(name,20) as names, 
        RIGHT(name,12) + '@' + LEFT(name,12) + '.com' as email, 
        sys.fn_sqlvarbasetostr(HASHBYTES('MD5', name)) as password 
INTO db 
FROM sys.all_columns 

Vedi SQLFIDDLE

0
DECLARE @X INT = 1 
WHILE @X <=1000 
BEGIN 
    INSERT INTO dbo.YourTable (ID, Age) 
    VALUES(@X,LEFT(RAND()*100,2) 
    SET @X+=1 
END; 

    enter code here 
DECLARE @X INT = 1 
WHILE @X <=1000 
BEGIN 
    INSERT INTO dbo.YourTable (ID, Age) 
    VALUES(@X,LEFT(RAND()*100,2) 
    SET @X+=1 
END; 
Problemi correlati