繁体   English   中英

具有自动增量功能的批量插入-无身份列

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM