如何在SQL BULK COPY中获取Identity值

本文关键字:获取 Identity COPY BULK SQL | 更新日期: 2023-09-27 18:15:05

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

有人能帮我一下吗?

如何在SQL BULK COPY中获取Identity值

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

简而言之,这个项目克服了SqlBulkCopy的限制,增加了一些必须具备的特性,比如输出插入的标识值。

在后台,它使用SqlBulkCopy和一个类似于@Mr Moose answer的方法。

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);

编辑:回答评论

我可以简单地得到一个列表,或者简单地说,我看到它保存在客户表中,但是没有变量,我可以得到它,你能帮我吗?我在Orders中插入。CustomerID表

这取决于,您可以在订单DataTable中保留对名为CustomerRef的客户数据ow的引用。

因此,一旦合并了客户,就可以轻松地从Order DataTable中的CustomerRef列填充CustomerID列。

下面是我想说的一个例子:https://dotnetfiddle.net/Hw5rf3

我使用了一个类似于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