web-dev-qa-db-fra.com

Comment insérer 1000 lignes à la fois

J'ai fait appliaction Wpf. Je veux le tester avec 1000 valeurs dans la grille. Je veux vérifier si ma grille chargera 1000 enregistrements rapidement ou non. Alors, comment écrire une requête pour insérer plus de 1000 enregistrements dans ma table de base de données. puis-je utiliser pour la boucle.

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

J'utilise Sql-Server 2012 et la connectivité ADO.net! Je veux exécuter cette requête dans la base de données pour générer 1000 lignes

MODIFIER

Et si je veux insérer des noms uniques?

17
Zoya Sheikh

Je crée une table student avec trois colonnes id, student,age. vous montrer cet exemple

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

voici le résultat de l'exemple enter image description here

33
very9527

Si vous avez un DataTable dans votre application, et c'est de là que proviennent les 1000 noms , vous pouvez utiliser un paramètre table pour cela.

Tout d'abord, un type de table:

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

Puis une procédure pour utiliser ceci:

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

Ensuite, votre code C # peut 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();

Si vous voulez simplement générer 1000 lignes avec des valeurs aléatoires :

;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;

Dans aucun de ces cas, vous ne devriez utiliser des boucles ou des curseurs. A MON HUMBLE AVIS.

9
Aaron Bertrand

Vous pouvez bien sûr utiliser une boucle ou les insérer dans une seule instruction, par exemple.

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

Cela dépend vraiment de l'endroit où vous obtenez vos données.

Si vous utilisez une boucle, l'envelopper dans une transaction le rendra un peu plus rapide.

METTRE &AGRAVE; JOUR

Et si je veux insérer des noms uniques? 

Si vous souhaitez insérer des noms uniques, vous devez générer des données avec des noms uniques. Une façon de procéder consiste à utiliser Visual Studio pour générer des données de test .

4
Joe

Vous pouvez insérer plusieurs enregistrements en insérant à partir d'un résultat:

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'

Ajoutez simplement autant de disques que vous aimez. Toutefois, la complexité de la requête peut être limitée, il est donc impossible d'ajouter 1 000 enregistrements à la fois.

4
Guffa

À propos, pourquoi n'utilisez-vous pas l'insertion de données XML dans une procédure stockée?

Voici le lien pour faire cela ... Insertion de données en bloc via une procédure stockée XML

2
DareDevil

En utilisant une idée de @Aaron Bertrand (FROM sys.all_columns), cela créera 1 000 enregistrements:

 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

Voir SQLFIDDLE

1
Fabien TheSolution

Manière la plus simple. 

Arrêtez simplement l'exécution dans 10 secondes. 

Create table SQL_test  ( ID INT IDENTITY(1,1), UserName varchar(100)) 
while 1=1 
insert into SQL_test values ('TEST') 
0
Hemanshu Trivedi
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;
0
simon