이 저장 프로 시저 문제를 해결하는 방법

sql sqlbulkcopy sql-server

문제

나는 2 개의 테이블을 가지고있다. 다음은 이러한 테이블을 제거한 버전입니다.

TableA
Id <pk> incrementing
Name varchar(50)

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

이제이 테이블은 서로 관계가 있습니다.

대본

사용자 1이 내 사이트에오고 몇 가지 작업을 수행합니다 (이 경우 표 A에 행 추가). 그래서 나는 SqlBulkCopy를이 모든 데이터를 표 A에 사용합니다.

그러나 나는 또한 테이블 B에 데이터를 추가해야하지만 SQLBulkCopy가이를 반환하지 않으므로 표 A에서 새로 생성 된 Id를 알지 못합니다.

그래서 테이블 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

노트:

  • 유혹이 연결에 국지적이며 고립 될 것이다.

  • 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는 합법적입니까? 예, 이유를 알아보십시오.