하나의 삽입이 실패 할 때 SqlBulkCopy가 트랜잭션을 롤백하는 것을 중지하십시오.

sqlbulkcopy sql-server

문제

SqlBulkCopy를 사용하여 서버에 레코드 일괄 처리를 삽입합니다. 고유 한 제약으로 인해 하나의 레코드가 실패하면 전체 일괄 처리를 롤백하지 않고 대신 기존 레코드를 업데이트하려고합니다.

벌크 삽입이 완료되면 실패한 레코드 키 값을 기록하고 되돌아 가서 개별적으로 주소를 지정할 수 있기를 바랬습니다.

그러나 실패한 트랜잭션을 롤백하지 않도록 SqlBulkCopy에 알리는 방법이나 실패한 레코드에 대한 정보를 얻는 방법을 알 수 없습니다.

레코드를 SqlBulkCopy DataTable에 추가하기 전에 레코드를 확인할 수는 있지만 상당한 오버 헤드가 추가됩니다.

나는 답변 확인하신 후 여기에 대량 삽입 한 후 삽입 / 업데이트를 할 준비 테이블 및 다른 SPROC를 사용하여 표시,하지만 난 sproc에 새로운 삽입하거나 기존 레코드를 업데이트 중 하나에 개별적으로 각 레코드를 처리 할 필요가 있다고 생각 - 매우 시간이 많이 걸린다.

다른 팁이나 지난 4 년간 변화된 점은 없습니까?

수락 된 답변

병합 문을 사용하지 않는 것이 좋습니다. SQL Server의 MERGE 문에주의를 기울여야합니다. 개인적으로 IMHO를 따르는 것이 어렵고 간단한 insert update 문 (너무 감미로운 구문 설탕이 아닙니다) 이상은 거의 제공하지 않습니다.

INSERT INTO A
SELECT *
FROM   #B B
       LEFT OUTER JOIN A
               ON A.ID  = B.ID
WHERE  A.ID IS NULL

또는

UPDATE A
SET    BLAH = 'BLAH'    
FROM   A
       INNER JOIN #B B
               ON B.ID  = A.ID

순수한 SQL이 아닌 도구에서 설정 한 경우 찾고있는 것을 처리 할 수있는 SSIS를 조사하고 싶을 수 있습니다.


인기 답변

SqlBulkCopy는 사용하지 마십시오.

직접.

임시 테이블에 삽입 (SqlBulkCopy의 끔찍한 잠금 동작 방지) 한 다음 적절한 규칙을 사용하여 최종 테이블에 병합합니다.

간단합니다. 이렇게하면 모든 일괄 업데이트가 수행됩니다.



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