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