2011-10-15 36 views
2

從C#中的SQL Server 2K8我試圖做一個批量插入/更新記錄到父/子表進行優化。批量插入返回標識和對象引用/序列

的插入/更新會自動生成一個密鑰,我想經由輸出來提取等,然後重新分配回域模型。對於批量插入,我需要跟蹤哪個新生成的ID屬於批處理列表中的哪個域對象。

這個例子來接近我所需要的,但不知道是否有一種方法來沒有一個額外的列添加到表中(的SequenceNumber),並且仍然獲得相同的結果:http://illdata.com/blog/2010/01/13/sql-server-batch-inserts-of-parentchild-data-with-ibatis/

即。我們可以依賴從OUTPUT生成的插入的順序到臨時表中,還是傳遞一個在數據模型中設置的ref GUID並臨時傳遞給SQL,僅供參考?

+1

既然你在SQL Server 2008中,你可以使用'合併... output'拿到生成的密鑰和臨時表使用的密鑰之間的映射。 http://stackoverflow.com/questions/5365629/using-merge-output-to-get-mapping-between-source-id-and-target-id –

+0

完美,這正是我需要Mikael!如果你想要,你可以將其作爲回答發佈,以便我可以將其標記爲這樣。 – soundslike

回答

0

除非我誤解...

代理鍵(IDENTITY或NEWID等)是不實際的對象標識符。這是一個實現細節,沒有內在意義。

你必須有另一個標識符(名稱,書號,序列號,交易代碼/日期等),那纔是真正的(天然)鍵。

您的OUTPUT子句可以返回代理鍵和自然鍵。然後,您使用它來映射回

+0

我有一個類說人{int ID,字符串名稱}和該表具有ID作爲IDENTITY列。但是我有一個我想要插入的People類的批次列表。最初,我只填充Name字段,在批處理列表中執行所有People類的批量插入,然後在我的C#類中設置Id屬性。我需要從我的批處理列表中適當的C#人員類中設置SQL Server上的Id。使用OUTPUT到臨時表時,我有一個由SQL Server創建的Ids列表,但無法真正知道應將其分配給哪個C#人員類。 – soundslike

+0

使用OUTPUT子句,可以獲得INSERTED.ID,INSERTED.Name。然後你匹配名稱來分配ID。您不限於OUTPUT子句中的一列 – gbn