具有自动增量的批量插入 - 无标识列

时间:2015-06-23 12:21:45

标签: c# sql sql-server insert primary-key

我正在尝试从Datatable实现批量插入数据。在我的MS-SQL表(目标表)中,我有一个主键不是标识列的列,所以我必须手动增加。但它在Code中是不可能的,因为在同一个表上会有多个Thread。如果有的话请给我建议。

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

提前致谢,

3 个答案:

答案 0 :(得分:0)

评论太长了。

如果您有一个主键列,则在插入行时需要对其唯一和非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;

答案 1 :(得分:0)

我有一个想法

通常我们使用表来存储记录,即使你使用前端插入数据,最后它也会存储在表中。所以我建议在表上使用带有insert触发器的序列。这意味着当您首先将数据插入表中时,将调用触发器,序列将递增,增加的值将与表中的其他值一起存储。试试吧。因为在oracle 11g中我们没有身份()因此我们将使用序列并为标识列插入触发器

答案 2 :(得分:0)

创建一个名为id的表。 VARCHAR(50)TableName,INT Id。 当您想要生成id时,请读取相关行并将其增加您想要在同一事务中插入的行数。 您现在可以随时批量插入这些行,而不必担心插入其他线程。 类似于Nhibernates HiLow发电机的工作原理。 http://weblogs.asp.net/ricardoperes/making-better-use-of-the-nhibernate-hilo-generator