Лучший способ вставить несколько записей в базу данных

74
9

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

я просто делаю это, как обычно, используя ExecuteNonQuery, и я использую цикл foreach для вставки каждой записи одну за другой (я не думаю, что это лучший способ сделать это, поскольку этот способ делает несколько поездок в базу данных для вставки записи).

 using (SqlCommand cmd = new SqlCommand()
{
using (SqlConnection conn = new SqlConnection()
{
cmd.Connection = conn;
foreach (var entry in entries)
{
cmd.CommandText = "INSERT INTO Employees(id, name) VALUES
(@id,@name);";
cmd.Parameters.AddWithValue("@id", entry.Id);
cmd.Parameters.AddWithValue("@name", entry.Name);
cmd.ExecuteNonQuery();
}
}
}

я попытался с помощью класса SqlBulkCopy, я преобразовал общий список в DataTable и использовал SqlBulkCopy.

using (SqlConnection con = new SqlConnection(consString))
{
using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(con))
{

sqlBulkCopy.DestinationTableName = "Employees";
con.Open();
sqlBulkCopy.WriteToServer(dt);
con.Close();
}
}

Оба метода выполняют намеченную работу. Но я хочу знать, какой из них лучший. Если есть какой-либо другой лучший способ сделать это, я открыт для предложений.

спросил(а) 2019-05-08T15:01:00+03:00 7 месяцев, 1 неделя назад
2
Решение
73

Использовать табличные параметры (TVP), которые были введены в SQL Server 2008. До SQL Server 2008 не было возможности передать табличную переменную в хранимой процедуре в качестве параметра, после SQL Server теперь мы можем передавать табличный параметр в отправлять несколько строк данных в хранимую процедуру или функцию, не создавая временную таблицу и не передавая столько параметров. взгляните на приведенный ниже пример

CREATE TYPE UT_Employee AS TABLE  
(
Emp_Id int NOT NULL,
EmployeeName nvarchar(MAX),
EmpSalary varchar(50),
StateId varchar(50),
CityId varchar(50)
)

CREATE PROCEDURE USP_Insert_Employee_Info
(
@Employee_Details [UT_Employee] READONLY
)
AS
BEGIN

INSERT INTO dbo.Employee
(
Emp_Id,
EmployeeName,
EmpSalary,
StateId,
CityId
)
SELECT * FROM @Employee_Details
END

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

DECLARE @Employee_Details AS UT_Employee
INSERT INTO @Employee_Details
SELECT 1001,'Abcd',10000,101,21 UNION ALL
SELECT 1002,'dggg',20000,121,15 UNION ALL
SELECT 1003,'esse',22222,122,35 UNION ALL
SELECT 1004,'uyyy',44333,121,32 UNION ALL
SELECT 1005,'dghd',13233,656,87

EXEC dbo.USP_Insert_Employee_Info @Employee_Details = @Employee_Details

ответил(а) 2019-05-08T15:32:00+03:00 7 месяцев, 1 неделя назад
Еще 1 ответ
33

Я бы обычно использовал для этого параметр с табличным значением. Объяснение того, как это сделать, немного длинно, но здесь см. Табличные значения в Документах Microsoft, чтобы узнать, как это сделать.

ответил(а) 2019-05-08T15:33:00+03:00 7 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема