2014-12-09 2 views
1

나는 "추가 된"레코드 인 레코드를 포함하는 .Net DataTable을 가지고 있습니다. 데이터베이스의 해당 테이블에 수백만 개의 행이 포함될 수 있습니다. 내 SqlDataAdapter에서 단순히 "Update"메서드를 호출하려고하면 기존 레코드가 기본 키 제약 조건 위반으로 인해 예외가 발생합니다. 나는 모든 물리적 테이블의 레코드를 두 번째 DataTable 인스턴스로로드하고 둘을 병합 한 다음 두 번째 DataTable에서 Update 메서드를 호출하는 것을 고려했습니다. 이것은 실제로 내가 원하는 것처럼 정확하게 작동합니다. 그러나 물리적 인 테이블에 300 억 개의 레코드가있는 경우 모든 데이터를 메모리에있는 DataTable에로드하는 것이 문제가 될 수 있습니다..Net DataTable을 사용하여 데이터베이스 테이블을 업데이트하고 기존 레코드를 무시하려면 어떻게해야합니까?

필자는 물리적 테이블에서 데이터의 하위 집합을 선택하고 위에서 설명한대로 진행할 것을 고려했지만 하위 쿼리의 작성은 매우 복잡하고 매우 지루한 것으로 입증되었습니다. 알다시피, 나는 알려진 단일 테이블을 가지고 일하지 않고있다. 수백 개의 DataTables가 포함 된 DataSet으로 작업하고 있습니다. 각 DataTables는 자체 물리적 테이블에 매핑됩니다. 테이블의 이름과 스키마는 컴파일 타임에 알려지지 않습니다. 이것은 모두 런타임에 완료되어야합니다.

SqlBulkCopy 클래스와 함께 플레이했지만 동일한 문제가 있습니다. 중복 레코드는 예외를 발생시킵니다.

런타임시 각 테이블에 대한 쿼리를 동적으로 생성하고 싶지 않습니다. 그것이 유일한 방법이라면 그렇게 할 수는 있지만 Ado.Net이 제공하는 것을 사용하는보다 간단한 솔루션이 있어야한다고 생각합니다.

답변

0

이 같이 당신에 InsertCommand를 만들 수 있습니다

declare @pk int = 1 
declare @txt nvarchar(100) = 'nothing' 
insert into #temp (id, txt) 
    select distinct @pk, @txt 
     where not exists (select id from #temp x where x.id = @pk) 

은 테이블 #temp (이 예에 사용되는 임시 테이블)

create table #temp (id int not null, txt nvarchar(100)) 
(ID에 대한 기본 키)과 같이 생성되는 것을 가정
관련 문제