簡體   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