数据库
首页 > 数据库> > c# – 快速插入SQL数据和相关行的最佳方法是什么?

c# – 快速插入SQL数据和相关行的最佳方法是什么?

作者:互联网

我需要编写一些代码来插入大约300万行数据.
同时我需要插入相同数量的伴随行.

即schema看起来像这样:

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);
}

但这不允许我添加相应的“属性”行.

我认为最好的解决方案可能是添加一个像this one这样的存储过程,它通常允许我进行批量插入(或者至少有多个插入,但我可能会以某种方式禁用存储过程中的日志记录以获得性能)然后返回相应的IDS.

谁能想到更好的(即更简洁,接近相同的性能)解决方案?

解决方法:

要结合以前最好的两个答案,并为ID添加缺少的部分:

1)使用BCP将数据加载到这样定义的临时“临时”表中

CREATE TABLE stage(Title AS VARCHAR(??), value AS {whatever});

并且您以后需要适当的性能索引:

CREATE INDEX ix_stage ON stage(Title);

2)使用SQL INSERT加载Item表:

INSERT INTO Item(Title) SELECT Title FROM stage;

3)最后通过使用Item连接阶段来加载Property表:

INSERT INTO Property(FK_ItemID, Value)
SELECT id, Value
FROM stage
JOIN Item ON Item.Title = stage.Title

标签:c,sql,sql-server,bulkinsert
来源: https://codeday.me/bug/20190722/1498994.html