2011-05-11 6 views
4

SqlBulkCopy는 개별 삽입 문을 보내는 대신 많은 양의 삽입 작업을 수행하도록 지원됩니다. 그러나 저장 프로 시저를 호출하는 것은 어떻습니까? 데이터가 전달 된 다음 다른 테이블에서 일부 조회를 수행하고 해당 조회 테이블에 두 번째 삽입을 수행하는 절차가 있습니다.저장 프로 시저의 SqlBulkCopy

이 값을 쿼리로 변환 할 수 없으므로 저장 프로 시저 호출에 SqlBulkCopy를 사용하는 방법이 있습니까? 아니면 이해가되지 않겠습니까?

DB 연결 당 한 번에 2000 개 이하의 호출 만 만들고 있지만 더 효율적인 방법이 있는지 알고 싶습니다.

+0

데이터베이스 효율성 또는 앱 효율성? –

+0

@Autstin SqlBulkCopy는 SQL 측면에서 효율성을 높이기위한 것입니다. –

답변

5

@Kev 답을 바탕으로 대량 테이블을 준비 테이블에 넣은 다음 트리거를 사용하여 저장 프로 시저를 시작할 수 있습니다.

다른 테이블에 FK 제약 조건이 있다고 가정하고 있으므로 대상 테이블에 삽입하기 전에 값이 필요합니다. 가능한 경우 제약 조건을 제거해보십시오. 대량 삽입을 수행하면 트리거가 나중에 열을 업데이트 할 수 있습니다.

+0

그리고 이것은 또한 SqlBulkCopy.BatchSize와 함께 작동합니다 - 대용량 데이터 청크가 처리를 일괄 적으로 제공하므로 편리합니다. – bland

1

유일한 방법은 대상 테이블에 트리거가 있고 SqlBulkCopyOptionsFireTriggers 옵션을 설정하는 것입니다.

거기에서 저장 프로 시저를 호출하거나 저장 프로 시저 논리를 해당 트리거에 넣을 수 있습니다.

테이블에 다른 클라이언트 (예 : 웹 앱)가 추가하는 경우 대량 복사 클라이언트와 다른 일반 앱을 구별 할 수있는 방법이 필요합니다. 난 당신이 연결 문자열에서 응용 프로그램 이름 값을 설정하고 SELECT APP_NAME()을 사용하여 트리거에서 확인하여 차별화 것 같아요.

+0

sproc는 키가 존재하는지 아닌지 먼저 확인하기 위해 다른 테이블을 먼저 선택해야하기 때문에 트리거가 작동하지 않습니다. 그렇지 않으면 키를 삽입하고 가져온 다음 대상 테이블에 삽입합니다. 그래서 이것은 정말로 선택적인 [insert,] insert입니다. –

0

삽입 된 각 행에 저장된 proc을 실행하려면 많은 레코드를 신속하게 삽입하는 삽입 목적을 무의식적으로 사용해야합니다. 스테이징 테이블에 삽입 한 다음 저장된 프로 시저를 수정하여 집합 논리를 사용하여 전체 데이터 집합을 한 번에 조작 할 수 있습니다.