【发布时间】:2011-09-20 11:39:46
【问题描述】:
与下面提到的其他问题类似,我有两个表的结构:
create table parent (
recno int identity(1,1) primary key not null,
groupCode int,
parentdata varchar(80)
);
create table child (
parentrecno int not null,
childdata varchar(80)
)
我需要在这些表中快速插入几十万条记录——这些表包含数百万条与此插入无关的其他记录,并且从不安静。由于父母/孩子的性质,它不是SqlBulkCopy 的好候选人(似乎)。
在 C# 中使用 SqlCommand 和 INSERT 我每秒插入大约 400-500 条记录,这有点太慢了。伪代码:
foreach(Record r in parentRecords)
{
Insert Fields from r into SqlCommand Parameters but not "recno"
Call ExecuteScalar to insert and fetch the inserted identity value (recno)
foreach(ChildRecord cr in parentRecords.Children)
{
Insert Fields from cr into SqlCommand Parameters
Insert the identity value (recno) from above into Parameters
(as parentrecno)
Call ExecuteNonQuery to insert the record
}
}
阅读其他帖子后,我想到了一个想法。附加到父记录的groupCode 对于我要插入的父记录集是唯一的。是否可以:
- 使用
SqlBulkCopy批量插入父记录,让插入像往常一样自动生成recno标识字段。 -
只对插入的记录执行
SELECT:select recno from parent where groupCode = @thisgroup order by recno; 使用检索到的值填写内存中子记录的
parentrecno字段- 使用
SqlBulkCopy批量插入子记录
这将依赖于以与原始 DataTable 中相同的顺序进入 SQL 表的父记录(并且以相同的顺序分配标识值)。 这是我可以依赖的吗?
相关问题:
How to update Dataset Parent & Child tables with Autogenerated Identity Key?
SqlBulkCopy and DataTables with Parent/Child Relation on Identity Column
【问题讨论】:
标签: c# sql-server-2008 sqlbulkcopy