如何解決此存儲過程問題

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合法嗎? 是的,了解原因