당신은 SqlBulkCopy를 사용하고 싶지 않으니까 대답은 AFAIK입니다. 실적이 좋은 시간에 EF를 사용하여 해당 양의 레코드를 삽입 할 수 없게됩니다. 한편 SqlBulkCopy의를 사용하여 완료 "영원히"가했다 EF를 ... 사용하여 14000 개 라인을 삽입 |
어쨌든 여기에 내가 업데이트하려고 할 때 그냥 당신에게 통찰력을 제공하기 위해,
DataTable dt = new DataTable("Table");
dt = GetDataTableFromSomewhereElse();
using (SqlConnection conn = new SqlConnection("YourConnectionString"))
{
using (SqlCommand command = new SqlCommand("", conn))
{
try
{
conn.Open();
command.CommandText = @"Create Table #TmpTable(
[Col1] [int] NOT NULL,
[Col2] [nvarchar](max) NOT NULL,
[Col3] [decimal](18, 2) NOT NULL)";
command.ExecuteNonQuery();
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn))
{
bulkCopy.BulkCopyTimeout = 660;
bulkCopy.DestinationTableName = "#TmpTable";
bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("Col1", "Col1"));
bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("Col2", "Col2"));
bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("Col3", "Col3"));
bulkCopy.WriteToServer(dt);
bulkCopy.Close();
}
command.CommandTimeout = 300;
command.CommandText = [email protected]"MERGE INTO Table p
USING #TmpTable t ON p.Col1 = t.Col1
WHEN MATCHED THEN UPDATE SET
p.Col2 = t.Col2,
p.Col3 = t.Col3,
WHEN NOT MATCHED THEN
INSERT VALUES(
t.Col1,
t.Col2,
t.Col3
);
Drop Table #TmpTable;";
command.ExecuteNonQuery();
}
catch (Exception ex)
{
...
}
}
}
SqlBulkCopy의
의 예 약 2-3 초가 걸렸습니다.
이 질문의 사본을 여러 개 찾을 수 있습니다. 당신은 이것을 묻는 첫 번째 사람이 아닙니다. –