我需要编写一些代码来插入大约300万行数据。
同时我需要插入相同数量的伴随行。什么是快速插入SQL数据和相关行的最佳方式?
I.e.模式是这样的:
Item
- Id
- Title
Property
- Id
- FK_Item
- Value
我第一次尝试是一件隐约这样的:
BaseDataContext db = new BaseDataContext();
foreach (var value in values)
{
Item i = new Item() { Title = value["title"]};
ItemProperty ip = new ItemProperty() { Item = i, Value = value["value"]};
db.Items.InsertOnSubmit(i);
db.ItemProperties.InsertOnSubmit(ip);
}
db.SubmitChanges();
显然,这是非常缓慢的,所以我现在用的是这样的:
BaseDataContext db = new BaseDataContext();
DataTable dt = new DataTable("Item");
dt.Columns.Add("Title", typeof(string));
foreach (var value in values)
{
DataRow item = dt.NewRow();
item["Title"] = value["title"];
dt.Rows.Add(item);
}
using (System.Data.SqlClient.SqlBulkCopy sb = new System.Data.SqlClient.SqlBulkCopy(db.Connection.ConnectionString))
{
sb.DestinationTableName = "dbo.Item";
sb.ColumnMappings.Add(new SqlBulkCopyColumnMapping("Title", "Title"));
sb.WriteToServer(dt);
}
但是这不允许我添加相应的'Property'行。
我在想最好的解决方案可能是添加一个像this one这样的存储过程,它通常允许我进行批量插入(或者至少多次插入,但我可能会以某种方式禁止在存储过程中记录性能)以及然后返回相应的ID。
任何人都可以想到更好的(即更简洁,几乎相同的性能)解决方案吗?
当然,但是这个假设标题是独一无二的(它可能是,但我不会依赖它,但这可能是最好的方向 – 2009-09-06 15:12:11
我不得不承担一些,因为你没有提供源表的信息。你必须有一些方法来唯一地关联信息:依赖于记录顺序在SQL中是无效的 – RBarryYoung 2009-09-06 21:18:40
也就是说,你可以在登台表上添加一个用于关联的ID(通常即使在顺序依赖关系下也可以),但它可以获得更复杂 – RBarryYoung 2009-09-06 21:19:54