SQLBulkCopy는 기본 키를 복사하지 않습니다.

c# sqlbulkcopy sql-server

문제

SQLBulkCopy를 사용할 때 기본 키 위반 오류를 처리하는 가장 좋은 방법은 무엇입니까?

Violation of PRIMARY KEY constraint 'email_k__'. Cannot insert duplicate key in object  'lntmuser.email'.

(즉, 행이 이미 대상 테이블에있는 경우)?

중복 행을 삽입하는 것을 건너 뛸 수있는 방법이 있습니까? 아니면이 행을 검사하고 처리해야합니까?

현재 사용중인 코드는 다음과 같습니다.

  var conPro = tx_ProConStr.Text;
  var conArc = tx_ArcConStr.Text;

  var con = new SqlConnection {ConnectionString = conPro};
  var cmd = new SqlCommand("SELECT * FROM dbo.email", con);
  con.Open();

  var rdr = cmd.ExecuteReader(); 
  var sbc = new SqlBulkCopy(conArc) {DestinationTableName = "dbo.email"};

  sbc.WriteToServer(rdr);

  sbc.Close();
  rdr.Close();
  con.Close();

수락 된 답변

일반적으로 임시 테이블에 대량 복사 작업을 수행 한 다음 일반 SQL을 사용하여 대상 테이블로 데이터를 복사합니다. 이것은 내가 '벌크 업데이트'를 수행 할 수있을뿐만 아니라 이와 같은 특별한 상황을 처리 할 수있게 해줍니다.

스트레이트 대량 복사에 비해 성능이 좋지만 INSERT를 수행하는 것보다 훨씬 빠릅니다.


인기 답변

중복을 제외하기 위해 원본 쿼리를 조정할 수 있습니다. 예 :

select distinct * from dbo.email

또는 pkcol 당 첫 번째 col1 을 필터링합니다.

select  *
from    (
        select  row_number() over (parition by pkcol order by col1) as rn
        from    dbo.email
        ) as SubQueryAlias
where   rn = 1


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.