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?
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
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.
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 .
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.
À 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
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
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')
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;