如何在SQL BULK COPY中获取Identity值?

我必须从SQLBULKCOPY之后的表中获取IDENTITY值到同一个表。 数据量可能是数千条记录。

有人可以帮我解决这个问题吗?

免责声明 :我是Bulk Operations项目的所有者

简而言之,该项目通过添加MUST-HAVEfunction(例如输出插入的标识值)来克服SqlBulkCopy限制。

在引擎盖下,它使用SqlBulkCopy和类似的方法@Mr Moose回答。

var bulk = new BulkOperation(connection) // Output Identity Value bulk.ColumnMappings.Add("CustomerID", ColumnMappingDirectionType.Output); // Map Column bulk.ColumnMappings.Add("Code"); bulk.ColumnMappings.Add("Name"); bulk.ColumnMappings.Add("Email"); bulk.BulkInsert(dt); 

我使用了与Marc Gravell类似的解决方案,因为首先导入临时表是很有用的。

我还使用了Jamie Thomson 在这篇文章中描述的MERGEOUTPUT来跟踪我插入到临时表中的数据,以便将它与我要插入的表的IDENTITY列生成的id相匹配。

当您需要将该ID用作要填充的其他表的外键引用时,这尤其有用。

试试这个

 CREATE TABLE #temp ( DataRow varchar(max) ) BULK INSERT #Temp FROM 'C:\tt.txt' ALTER TABLE #temp ADD id INT IDENTITY(1,1) NOT NULL SELECT * FROM #temp 
 -- 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