문제

SQL Server 2000 쿼리 분석기에서 다음 쿼리를 실행하면:

BULK INSERT  OurTable 
FROM 'c:\OurTable.txt' 
WITH (CODEPAGE = 'RAW', DATAFILETYPE = 'char', FIELDTERMINATOR = '\t', ROWS_PER_BATCH = 10000, TABLOCK)

40줄에 대한 OurTable의 스키마를 준수하지만 마지막 20줄의 형식을 변경하는 텍스트 파일(마지막 20줄의 필드 수가 더 적다고 가정)에서 오류가 발생합니다.그러나 처음 40줄은 테이블에 커밋됩니다.트랜잭션이 불가능하도록 대량 삽입을 호출하는 방식에 뭔가가 있습니까? 아니면 실패 시 강제로 롤백하도록 명시적인 작업을 수행해야 합니까?

도움이 되었습니까?

해결책

BULK INSERT 일련의 개인 역할을 합니다. INSERT 문이므로 작업이 실패하면 커밋된 삽입을 모두 롤백하지 않습니다.

그러나 트랜잭션 내에 배치하여 다음과 같이 할 수 있습니다.

BEGIN TRANSACTION
BEGIN TRY
BULK INSERT  OurTable 
FROM 'c:\OurTable.txt' 
WITH (CODEPAGE = 'RAW', DATAFILETYPE = 'char', FIELDTERMINATOR = '\t', 
   ROWS_PER_BATCH = 10000, TABLOCK)
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
END CATCH

다른 팁

삽입물을 롤백할 수 있습니다.그러기 위해서는 먼저 두 가지를 이해해야 합니다.

BatchSize

:트랜잭션당 삽입할 행 수입니다.기본값은 전체 데이터 파일입니다.따라서 데이터 파일이 트랜잭션 중입니다.

10개의 행이 있고 행 8과 행 7에 잘못된 세부 정보가 있는 텍스트 파일이 있다고 가정해 보겠습니다.배치 크기를 지정하지 않거나 지정하여 파일을 대량 삽입하면 10개 중 8개가 테이블에 삽입됩니다.잘못된 행, 즉8번과 7번은 실패하여 삽입되지 않습니다.

이는 기본값 때문에 발생합니다. MAXERRORS 횟수는 거래당 10입니다.

MSDN에 따르면:

최대 오류:

벌크 내포 작업이 취소되기 전에 데이터에서 허용되는 최대 구문 오류 수를 지정합니다.벌크 내입 작업으로 가져올 수없는 각 행은 무시되고 하나의 오류로 계산됩니다.max_errors가 지정되지 않은 경우 기본값은 10입니다.

따라서 하나가 유효하지 않은 경우에도 10개의 행이 모두 실패하도록 하려면 다음을 설정해야 합니다. MAXERRORS=1 그리고 BatchSize=1 여기서 BatchSize의 수도 중요합니다.

BatchSize를 지정하고 잘못된 행이 특정 배치 내에 있는 경우 전체 데이터 세트가 아닌 특정 배치만 롤백됩니다.그러니 이 옵션을 선택할 때 주의하세요

문제가 해결되기를 바랍니다.

에 명시된 바와 같이 BATCHSIZE MSDN Library의 BULK INSERT에 대한 정의(http://msdn.microsoft.com/en-us/library/ms188365(v=sql.105).aspx) :

"이 작업이 실패하면 SQL Server는 모든 일괄 처리에 대해 트랜잭션을 커밋하거나 롤백합니다..."

결론적으로 대량 삽입에 트랜잭션성을 추가할 필요는 없습니다.

사용자 정의 트랜잭션에 넣고 무슨 일이 일어나는지 확인해보세요.실제로 설명대로 롤백되어야 합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top