我需要編寫一些代碼來插入大約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