如何在SQL BULK COPY中获取Identity值
本文关键字:获取 Identity COPY BULK SQL | 更新日期: 2023-09-27 18:15:05
我必须在SQLBULKCOPY到同一表之后从表中获取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在这篇文章中描述的MERGE
和OUTPUT
来跟踪我插入到我的临时表中的数据,以使其与我想插入的表的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