【问题标题】:How to get the Identity values in SQL BULK COPY?如何在 SQL BULK COPY 中获取标识值?
【发布时间】:2016-10-27 08:05:25
【问题描述】:

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

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

【问题讨论】:

  • 只需像插入 1 条记录一样获取 IDENTITY...记录的数量无关紧要吗?
  • 插入后选择它们,您需要包含一个批量插入的标识符...所以添加列batchId或其他内容,然后重新选择具有相同batchid的所有记录。
  • 只是出于对我们谈论多少记录的兴趣。 (棒球场)

标签: c# sql-server sqlbulkcopy


【解决方案1】:

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

简而言之,该项目通过添加必须具备的功能(例如输出插入的标识值)来克服 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);

编辑:回复评论

我可以简单地得到一个 IList 还是简单地,我看到它保存在客户表中,但是没有变量可以让我掌握它,请你帮忙。所以,我在 Orders.CustomerID 表中插入

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

因此,一旦您合并了您的客户,您就可以轻松地从您的订单数据表中的 CustomerRef 列中填充一个列 CustomerID

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

【讨论】:

  • 嗨,我怎样才能将bulk.ColumnMappings.Add("CustomerID", ColumnMappingDirectionType.Output); 添加/映射到不同的表,例如customerOrder table
  • 您不能将其映射到不同的表。但是,您可以返回它并将该值用于下一个批量操作。这是一个显示如何返回值的 Fiddle:dotnetfiddle.net/g5pSS1
  • 哇,这是一个更简单更容易使用的库。我卡住了,无法获取输出 id dotnetfiddle.net/yMfhPD ,如何获取输出 id 的缓存/列表?我可以简单地得到一个 IList 还是简单地,我看到它保存在客户表中,但是没有变量可以让我掌握它,你能帮忙吗?所以,我在Orders.CustomerID 表中插入
【解决方案2】:

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

我还使用了 Jamie Thomson on this post 所描述的 MERGEOUTPUT 来跟踪我插入到临时表中的数据,以将其与我想要的表的 IDENTITY 列生成的 id 匹配插入。

当您需要将该 ID 用作对正在填充的其他表的外键引用时,这特别有用。

【讨论】:

    【解决方案3】:

    试试这个

    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
    

    【讨论】:

      【解决方案4】:
      -- 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
      

      【讨论】:

      • @Ann88,直接从我在回答中链接的 Marc Gravell 的回答中复制而来。如果您要复制答案,请确保您记下答案的来源。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-15
      • 1970-01-01
      • 2011-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多