[英]Bulk Insert With Auto Increment - No Identity column
我正在尝试从Datatable实现批量插入数据。 在我的MS-SQL表(目标表)中,我有一列具有主键而不是标识列,因此我必须手动进行递增。 但这在代码中是不可能的,因为同一张桌子上会有多个线程。如果有的话请给我建议。
public void BulkInsert(DataTable dtTable)
{
DataTable dtProductSold = dtTable;
//creating object of SqlBulkCopy
SqlBulkCopy objbulk = new SqlBulkCopy(ConStr.ToString());
//assigning Destination table name
objbulk.DestinationTableName = "BatchData_InvReportMapping";
//Mapping Table column
objbulk.ColumnMappings.Add("InvPK", "InvPK");
objbulk.ColumnMappings.Add("DateValue", "DateDalue");
objbulk.ColumnMappings.Add("TextValue", "TextValue");
objbulk.ColumnMappings.Add("NumericValue", "NumericValue");
objbulk.ColumnMappings.Add("ErrorValue", "ErrorValue");
//inserting bulk Records into DataBase
objbulk.WriteToServer(dtProductSold);
}
提前致谢,
这个评论太长了。
如果您有主键列,那么您在插入行时需要对其唯一和非NULL负责。 SQL Server提供了一种非常方便的机制来帮助解决这一问题,这就是“ identity
列。
如果您没有身份,那么我基本上有两种选择:
等一下。 bulk insert
的默认选项是不触发触发器,因此第二选择确实不是一个好选择。
而是,修改表以使其具有标识主键列。 然后在没有主键的表上定义视图,然后将其批量插入视图中。 然后将自动分配主键。
编辑:
还有第三种选择,这可能是可行的。 将数据加载到暂存表中。 然后从登台表插入到最终表中,计算出主键值。 像这样:
insert into finaltable (pk, . . .)
select m.maxpk + seqnum, . . . .
from (select row_number() over (order by (select null)) as seqnum,
. . .
from stagingtable
) s cross join
(select max(pk) as maxpk
from finaltable
) m;
我有一个主意
通常我们使用表来存储记录,即使最终使用前端插入数据也将存储在表中。所以我建议在表上使用带有插入触发器的序列。 这意味着当您首先将数据插入表中时,将调用触发器,序列将递增,增加的值将与其他值一起存储在表中。 只是尝试这个。 因为在oracle 11g中我们没有identity(),所以我们将使用序列并为identity列插入触发器
创建一个名为id的表。 VARCHAR(50)TableName,整数ID。 当您要生成ID时,请阅读相关行,并增加要在同一事务中插入的行数。 现在,您可以随时批量插入这些行,而不必担心其他线程会插入它们。 与Nhibernates HiLow生成器的工作方式相似。 http://weblogs.asp.net/ricardoperes/making-better-use-of-the-nhibernate-hilo-generator
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.