首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在一次SQL BulkCopy之后,有可能取回PrimaryKey ID吗?

在一次SQL BulkCopy之后,有可能取回PrimaryKey ID吗?
EN

Stack Overflow用户
提问于 2010-06-01 02:50:15
回答 7查看 17.4K关注 0票数 24

我正在使用C#和SqlBulkCopy。不过,我有个问题。我需要在一个表中执行批量插入,然后在另一个表中执行批量插入。

这两个是PK/FK关系。

Table A
Field1 -PK auto incrementing (easy to do SqlBulkCopy as straight forward)

Table B
Field1 -PK/FK - This field makes the relationship and is also the PK of this table. It is not auto incrementing and needs to have the same id as to the row in Table A.

因此,这些表具有一对一的关系,但我不确定如何取回批量插入创建的所有这些PK Id,因为我需要将它们用于表B。

编辑

我能做这样的事情吗?

SELECT * 
FROM Product
WHERE NOT EXISTS (SELECT * FROM ProductReview WHERE Product.ProductId = ProductReview.ProductId AND Product.Qty = NULL AND Product.ProductName != 'Ipad')

这将查找刚刚使用sql大容量复制插入的所有行。我不确定如何从这里获得结果,然后从SP中使用它们进行批量插入。

我能看到的唯一问题是,如果用户一次只做一条记录,同时运行this语句,它可能会尝试在"Product Review Table“中插入一行两次。

假设我有一个用户使用手动方式,另一个用户几乎同时使用大众方式。

手动方式。 1.用户提交数据2.制作Linq to sql Product对象,填充数据并提交。3.此对象现在包含linq 4.为Product review表创建了另一个ProductId to sql对象,并插入了该对象(发送了步骤3中的产品Id )。

批量方式。 1.用户从共享数据的用户那里抓取数据。2.抓取来自共享用户的所有Product行。3.对Product行执行SQL大容量复制插入。4.我的SP选择只存在于Product表中且满足某些其它条件的所有行。5.对这些行执行成批插入。

那么,如果步骤3(手动方式)与步骤4(大众方式)同时发生,会发生什么情况?我认为它会尝试将同一行插入两次,从而导致主约束执行。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-06-01 03:34:47

在该场景中,我将使用SqlBulkCopy将数据插入到staging表(即,该表看起来与我要导入的数据相似,但不是主事务性表的一部分),然后在数据库中将数据移动到INSERT/SELECT,以将数据移动到第一个真正的表中。

现在,根据服务器版本的不同,我有两个选择;我可以对第二个真实的表执行第二次INSERT/SELECT,也可以使用INSERT/OUTPUT子句使用表中的identity行执行第二次插入。

例如:

     -- 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
票数 16
EN

Stack Overflow用户

发布于 2012-04-30 20:30:52

如果您的应用程序允许,您可以添加另一个列,在其中存储大容量插入的标识符(例如,guid )。您可以显式设置此id。

然后,在大容量插入之后,您只需选择具有该标识符的行。

票数 9
EN

Stack Overflow用户

发布于 2012-12-15 05:26:57

我遇到了同样的问题,我必须获取使用SqlBulkCopy插入的行的I。我的ID列是identity列。

解决方案:

我已经使用海量复制插入了500+行,然后用以下查询重新选择了它们:

SELECT TOP InsertedRowCount * 
FROM   MyTable 
ORDER BY ID DESC

这个查询返回我刚刚插入的行和它们的ids。在我的例子中,我有另一个独特的专栏。所以我选择了这一列和id。然后将它们映射为如下所示的IDictionary:

 IDictionary<string, int> mymap = new Dictionary<string, int>()
 mymap[Name] = ID

希望这能有所帮助。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2945414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档