如何一次插入1000行

时间:2013-08-31 16:01:07

标签: sql-server database

我做了Wpf appliaction。我想用网格中的1000个值来测试它。我想检查一下我的网格是否会快速加载1000条数据记录。那么如何编写一个查询来在我的数据库表中插入超过1000条记录。我可以用于循环吗。

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

我正在使用Sql-Server 2012和ADO.net连接!我想在数据库中执行此查询以生成1000行

修改

如果我想插入唯一名称该怎么办?

9 个答案:

答案 0 :(得分:35)

我创建了一个包含三列student的{​​{1}}表。给你看这个例子

id, student,age

这是关于这个例子的结果 enter image description here

答案 1 :(得分:9)

如果您的应用程序中有DataTable,并且这是1000个名称的来源,您可以使用表值参数。

首先是表格类型:

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

然后使用此程序:

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

然后您的C#代码可以说:

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

如果您只想生成包含随机值的1000行

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

在这两种情况下都不应该使用while循环或游标。 IMHO。

答案 2 :(得分:4)

您当然可以使用循环,也可以将它们插入单个语句中,例如

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

这取决于您从哪里获取数据。

如果您使用循环,将其包装在事务中将使其更快一些。

<强>更新

  

如果我想插入唯一名称该怎么办?

如果要插入唯一名称,则需要生成具有唯一名称的数据。一种方法是使用Visual Studio to generate test data

答案 3 :(得分:4)

您可以通过从结果插入来插入多个记录:

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'

只需添加任意数量的记录即可。但是查询的复杂性可能存在限制,因此可能无法一次添加多达1000条记录。

答案 4 :(得分:2)

顺便说一下,为什么不通过存储过程使用XML数据插入?

这是执行此操作的链接... Inserting Bulk Data through XML-Stored Procedure

答案 5 :(得分:1)

使用@Aaron Bertrand的想法(FROM sys.all_columns),这将创建1000条记录:

 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

参见 SQLFIDDLE

答案 6 :(得分: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;

答案 7 :(得分:0)

最简单的方法。

仅在10秒内停止执行。

Create table SQL_test  ( ID INT IDENTITY(1,1), UserName varchar(100)) 
while 1=1 
insert into SQL_test values ('TEST') 

答案 8 :(得分:0)

您也可以使用以下CTE。您可以根据需要修改它。但这会将相同的值添加到学生CTE中。

这将添加1000条记录,但您可以将其更改为10000或最多32767

;WITH thetable(rowid,sname,semail,spassword) AS
(
    SELECT 1  , 'name' , 'email' , 'password'
    UNION ALL
    SELECT rowid+1 ,'name' , 'email' , 'password' 
    FROM thetable WHERE rowid < 1000
)

SELECT rowid,sname,semail,spassword 
FROM thetable ORDER BY rowid
OPTION (MAXRECURSION 1000);