2010-05-20 3 views
0

대량 삽입과 대량 복사를 동시에 수행하는 방법이 궁금합니다. 그들은 서로에 의존하기 때문에 대량 복사에 영향을 받아야하는 2 개의 테이블이 있습니다.SQl BulkCopy에 대한 질문

그래서 테이블 1을 삽입하는 동안 레코드가 없어지면 테이블 2가 롤백되고 테이블 2는 결코 업데이트되지 않기를 원합니다. 또한 테이블 1이 good을 삽입하고 테이블 2가 실패하면 테이블 1이 롤백됩니다.

대량 복사로이 작업을 수행 할 수 있습니까?

편집

나는 C#을하지만 대량 삽입을하고있는 중이 언급한다.

일종의 모습이지만 이것은 제가 수행 한 예입니다. 그래서 나는

private static void BatchBulkCopy() 
{ 
    // Get the DataTable 
    DataTable dtInsertRows = GetDataTable(); 

    using (SqlBulkCopy sbc = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.KeepIdentity)) 
    { 
     sbc.DestinationTableName = "TBL_TEST_TEST"; 

     // Number of records to be processed in one go 
     sbc.BatchSize = 500000; 

     // Map the Source Column from DataTabel to the Destination Columns in SQL Server 2005 Person Table 
     // sbc.ColumnMappings.Add("ID", "ID"); 
     sbc.ColumnMappings.Add("NAME", "NAME"); 

     // Number of records after which client has to be notified about its status 
     sbc.NotifyAfter = dtInsertRows.Rows.Count; 

     // Event that gets fired when NotifyAfter number of records are processed. 
     sbc.SqlRowsCopied += new SqlRowsCopiedEventHandler(sbc_SqlRowsCopied); 

     // Finally write to server 
     sbc.WriteToServer(dtInsertRows); 
     sbc.Close(); 
    } 

} 

답변

0

대량을 어떻게 동시에 수행 할 수 있습니까? 동시에 삽입 및 대량 복사가 가능합니까? 에 영향을 주어야하는 2 개의 테이블이 있습니다.이 두 테이블은 각각 ​​ 에 의존하기 때문에 대량 복사가 가능합니다. 그래서 나는 그것을 원한다면 테이블 1을 삽입하는 동안 레코드가 죽으면 롤백되고 테이블 2는 결코 이 업데이트됩니다. 또한 테이블 1에 이 좋고 테이블 2에 업데이트가 실패한 경우 1이 롤백됩니다. 이 작업을 대량 복사 할 수 있습니까? ?

아니요 - SqlBulkCopy의 핵심은 가능한 빨리 데이터베이스에 데이터를 가져 오는 것입니다. 데이터를 단일 테이블로 덤프합니다.

정상적인 사용 사례는 가져온 테이블을 검사 한 다음 해당 데이터를 "분할하여"필요한 모든 위치 (일반적으로 저장 프로 시저를 통해)에 저장하기 시작합니다 (데이터가 이미 있으므로 서버에 저장하고 다른 테이블에 배포하려는 경우 - 모든 데이터를 클라이언트로 다시 가져 와서 검사하고 다시 서버로 다시 보내지 않으려는 경우).

SqlBulkCopy는 많은 데이터를 가져 와서 테이블에 드롭합니다. 은 기준 또는 조건에 따라 데이터를 여러 테이블로 나눌 수 없습니다.

0

당신은 내부 사용자 정의 트랜잭션의 대량 삽입을 실행할 수 있습니다 (이 어떻게 보일지과 C# 코드가 어떻게 보일지 모르겠) 저장 프로 시저를 수를 변경해야하는 경우 확실하지 않다 그래서 다음과 같이하십시오 :

BEGIN TRANSACTION MyDataLoad 
BEGIN TRY 

BULK INSERT ... 

BULK INSERT ... 

COMMIT TRANSACTJION MyDataLoad 
END TRY 
BEGIN CATCH 
    ROLLBACK TRANSACTION 
END CATCH 

그러나 원하는 것을 성취 할 수있는 다른 방법이있을 수 있습니다. 일괄 적으로 삽입하기 전에 테이블이 비어 있습니까? 테이블이 서로 의존한다고 할 때, 시행 할 외래 키 제약 조건이 있다는 것을 의미합니까?

+0

미안하지만 C# 코드를 통해이 모든 작업을 수행하고 있다고 언급해야합니다. 그래서 나는 당신이 보여준 것을 어떻게하는지 확신하지 못합니다. 그것들은 외래 키 제약 조건입니다. 그러나 서로에 의존한다고 할 때 나는 테이블 2가 이미 채워져 있음을 의미합니다.하지만 삽입이 일어나면 테이블 2의 레코드를 활성화 된 상태로 만듭니다. (이것은 라이센스를위한 것입니다. 사용자 목록을 얻는다면 각각 데이터베이스에 이미 있지만 비활성으로 설정 한 키를 얻으므로이 시간에 활성으로 변경하고 싶습니다. – chobo2