Как вставить 1000 строк за раз

Я сделал приложение Wpf. Я хочу проверить его с 1000 значений в сетке. Я хочу проверить, будет ли моя сетка загружать 1000 записей данных быстро или нет. Итак, как написать один запрос для вставки более 1000 записей в мою таблицу базы данных. я могу использовать для цикла.

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

Я использую Sql-Server 2012 и ADO.net Connectivity! Я хочу выполнить этот запрос в базе данных для создания 1000 строк

ИЗМЕНИТЬ

Что делать, если я хочу вставить уникальные имена?

Ответы

Ответ 1

Я создаю таблицу 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

это результат о примере enter image description here

Ответ 2

Если у вас есть 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

Тогда ваш код С# может сказать:

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;

В любом из этих случаев вы не должны использовать циклы или курсоры. ИМХО.

Ответ 3

Вы можете, конечно, использовать цикл, или вы можете вставить их в один оператор, например.

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

Это действительно зависит от того, откуда вы получаете свои данные.

Если вы используете цикл, обертывание его в транзакции сделает его немного быстрее.

UPDATE

Что делать, если я хочу вставить уникальные имена?

Если вы хотите вставлять уникальные имена, вам нужно генерировать данные с уникальными именами. Один из способов сделать это - использовать Visual Studio для генерации тестовых данных.

Ответ 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 записей одновременно.

Ответ 6

Используя идею @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

Ответ 7

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;

Ответ 8

Самый простой способ.

Просто остановите казнь через 10 секунд.

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