可以在SQL BulkCopy之後返回PrimayKey ID嗎?

c# sql sqlbulkcopy sql-server-2005

我正在使用C#並使用SqlBulkCopy。我有一個問題。我需要將質量插入到一個表中,然後將另一個質量插入到另一個表中。

這2個具有PK / FK關係。

Table A
Field1 -PK auto incrementing (easy to do SqlBulkCopy as straight forward)

Table B
Field1 -PK/FK - This field makes the relationship and is also the PK of this table. It is not auto incrementing and needs to have the same id as to the row in Table A.

所以這些表有一對一的關係,但我不確定如何取回質量插入所做的所有PK Id,因為我需要它們用於表B.

編輯

我可以這樣做嗎?

SELECT * 
FROM Product
WHERE NOT EXISTS (SELECT * FROM ProductReview WHERE Product.ProductId = ProductReview.ProductId AND Product.Qty = NULL AND Product.ProductName != 'Ipad')

這應該找到剛用sql批量複製插入的所有行。我不確定如何從中獲取結果然後從SP進行質量插入。

我能看到的唯一問題是,如果用戶一次只執行一條記錄,並且此語句同時運行,則可能會嘗試在“Product Review Table”中插入兩行。

所以說我有一個用戶使用手動方式,另一個用戶大約在同一時間進行大規模使用。

手動方式。 1.用戶提交數據2. Linq to sql產品對像被生成並填充數據並被提交。 3.此對象現在包含ProductId 4.另一個linq to sql對像是為Product review表生成的並且已插入(步驟3中的Product Id隨之發送)。

群眾之路。 1.用戶從共享數據的用戶那裡獲取數據。 2.抓取共享用戶的所有產品行。 3.發生產品行上的SQL批量複製插入。 4.我的SP選擇僅存在於Product表中的所有行,並滿足其他一些條件.5。這些行會發生大量插入。

那麼如果步驟3(手動方式)與步驟4(質量方式)同時發生會發生什麼。我認為它會嘗試兩次插入相同的行,導致主要約束執行。

一般承認的答案

在那種情況下,我會使用SqlBulkCopy插入一個臨時表(即看起來像我要導入的數據,但不是主要事務表的一部分),然後在DB中INSERT / SELECT將數據移動到第一個真實表中。

現在我有兩個選擇,具體取決於服務器版本;我可以對第二個真實表執行第二次INSERT / SELECT ,或者我可以使用INSERT / OUTPUT子句使用表中的標識行執行第二次插入。

例如:

     -- dummy schema
     CREATE TABLE TMP (data varchar(max))
     CREATE TABLE [Table1] (id int not null identity(1,1), data varchar(max))
     CREATE TABLE [Table2] (id int not null identity(1,1), id1 int not null, data varchar(max))

     -- imagine this is the SqlBulkCopy
     INSERT TMP VALUES('abc')
     INSERT TMP VALUES('def')
     INSERT TMP VALUES('ghi')

     -- now push into the real tables
     INSERT [Table1]
     OUTPUT INSERTED.id, INSERTED.data INTO [Table2](id1,data)
     SELECT data FROM TMP

專家解答

免責聲明 :我是C#Bulk Operations項目的所有者

該庫克服了SqlBulkCopy限制並添加了輸出插入標識值等靈活功能。

在代碼後面,它確實像接受的答案,但更容易使用。

var bulk = new BulkOperation(connection);

// Output Identity
bulk.ColumnMappings.Add("ProductID", ColumnMappingDirectionType.Output);
// ... Column Mappings...

bulk.BulkInsert(dt);


許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因