如何解决此存储过程问题

sql sqlbulkcopy sql-server

我有2张桌子。以下只是这些表的精简版。

TableA
Id <pk> incrementing
Name varchar(50)

TableB
TableAId <pk> non incrementing
Name varchar(50)

现在这些表彼此有关系。

脚本

用户1来到我的站点并执行一些操作(在这种情况下向表A添加行)。所以我在表A中使用了SqlBulkCopy所有这些数据。

但是,我还需要将数据添加到表B,但我不知道表A中新创建的Id,因为SQLBulkCopy不会返回这些。

所以我想有一个存储过程,找到表B中不存在的所有id,然后插入它们。

INSERT INTO TableB (TableAId , Name)
SELECT Id,Name FROM TableA as tableA
WHERE not exists( ...)

然而,这带来了一个问题。用户可以随时从TableB中删除某些内容,因此如果用户删除说出一行然后另一个用户出现,或者甚至同一个用户出现并对表A执行某些操作,则我的存储过程将带回表B中已删除的行。因为它仍然存在于表A中但不存在于表B中,因此满足存储过程条件。

那么有没有更好的方法来处理使用批量插入时需要更新的两个表?

一般承认的答案

SQLBulkCopy使这变得复杂,所以我考虑使用临时表和OUTPUT子句

例如,客户端伪代码和SQL的混合

create SQLConnection

Create #temptable
Bulkcopy to #temptable

Call proc on same SQLConnection

proc:
   INSERT tableA (..)
   OUTPUT INSERTED.key, .. INTO TableB
   SELECT .. FROM #temptable

close connection

笔记:

  • temptable将是连接的本地,并被隔离

  • 对A和B的写入将是原子的
  • 重叠或稍后写入不关心A和B后面发生的事情
  • 强调最后一点,A和B只会从#temptable中的行集填充

替代方案:

将另一列添加到名为sessionid的A和B,并使用它来标识行批处理。


热门答案

作为替代解决方案,您可以使用数据库触发器来更新第二个表。




许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因