SqlBulkCopy overpassing - 기본 키 위반

sqlbulkcopy sql-server vb.net

문제

SqlBulkCopy를 사용하여 데이터베이스 레코드를 일괄 적으로 업로드하려고합니다. 일부 데이터는 이미 대상 테이블에 있으므로 10 개 중 하나의 레코드가 존재하더라도 나머지는 업로드되지 않습니다. 나머지 9 개의 레코드를 업로드 할 수있는 방법이 있습니까?

Try
    Using bulkCopy As SqlBulkCopy = New SqlBulkCopy(conBSD)
       bulkCopy.DestinationTableName = "dbo.cheques2"
        ' Write from the source to the destination.
        bulkCopy.BulkCopyTimeout = 60
        bulkCopy.WriteToServer(dtToUpload)
        iSuccessInserted += 10
        dtToUpload.Clear()
        dtToUpload.Dispose()
        MsgBox("Current " & iCurrent.ToString & " -  " & " In table toUpload " )
   End Using

'Duplicate key, access violation when trying to insert record with same recordID

Catch ex As SqlException When ex.ErrorCode = -2146232060 
   MsgBox(ex.Message & " " & ex.ErrorCode)
   dtToUpload.Clear()
   dtToUpload.Dispose()
   Exit Try
Catch ex As Exception
   MsgBox(ex.Message)
End Try

수락 된 답변

성능 관점에서 가장 좋은 방법은 복제본의 가능성에 따라 다릅니다. 중복이 드문 경우 먼저 대량 복사를 시도한 다음 단일 행 조건부 삽입으로 되돌아 가거나 PK 위반이 발생할 경우 병합 할 수 있습니다.

TVP에서 조건부로 행을 삽입하는 IEnumerable SqlDataRecord 형식의 테이블 반환 매개 변수를 사용하는 저장 프로 시저로 뛰어난 성능을 보았습니다. TVP 메서드는 내부적으로 tempdb에 데이터를 대량 삽입하여 매우 잘 수행합니다. 원본 배치에 중복이있는 경우 테이블 변수에 삽입하고 조건부 삽입이나 병합의 소스로 사용하여 proc 내부의 중복을 제거 할 수 있습니다. TVP 방법을 사용하면 일괄 처리 크기를 늘리고 성능을 크게 향상시킬 수 있습니다.



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