gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 13:42:58 25 4
gpt4 key购买 nike

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

即架构看起来像这样:

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这通常允许我进行批量插入(或至少多次插入,但我可能可以以某种方式禁用存储过程中的日志以提高性能),然后返回相应的 ID。

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

最佳答案

合并前两个最佳答案并添加 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) 最后通过将 stage 与 Item 连接来加载 Property 表:

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

关于c# - 快速插入 SQL 数据和相关行的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1385668/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com