29

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

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

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

编辑

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

4

9 回答 9

54

我创建了一个student包含三列的表id, student,age。给你看这个例子

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

这是关于示例的结果 在此处输入图像描述

于 2013-08-31T16:09:24.780 回答
12

如果您的应用程序中有一个 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 循环或游标。恕我直言。

于 2013-08-31T18:17:50.023 回答
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 条记录可能是不可能的。

于 2013-08-31T16:12:53.877 回答
4

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

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

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

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

更新

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

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

于 2013-08-31T16:11:19.257 回答
2

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

这是执行此操作的链接... 通过 XML 存储过程插入批量数据

于 2013-11-05T12:24:26.690 回答
2

使用@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

于 2013-08-31T19:38:31.867 回答
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;
于 2013-09-02T03:38:25.540 回答
0

最简单的方法。

只需在 10 秒内停止执行。

Create table SQL_test  ( ID INT IDENTITY(1,1), UserName varchar(100)) 
while 1=1 
insert into SQL_test values ('TEST') 
于 2019-01-25T18:42:23.463 回答
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);
于 2020-06-05T02:42:03.740 回答