1

C#에서 SqBulkCopy를 통해 SQL Server로 가져 오는 텍스트 파일 집합이 있습니다. 여러 레코드에 나타나는 일부 레코드가 있으며 오류를 던지고 중지하는 대신 해당 레코드를 건너 뛰고 싶습니다.SQL Server에서 완전히 동일한 레코드 건너 뛰기

'고유 ID'/ 기본 키가있는 경우 모두 양호합니다. 'WITH (IGNORE_DUP_KEY = ON)'을 사용하여 효과를 나타 냈습니다.

이 경우에도 uniqueID를 결정할 수 없으며 모든 필드를 함께 결합하지 않거나 모든 필드를 포함하는 복합 키를 만들지 않습니다. 고유 한 transactionID 또는 비슷한 것을 얻으려고했지만 아무 것도 사용할 수 없습니다. 때때로 레코드는 동일하지만 필드의 한 자릿수가 변경되었습니다. 이 경우 테이블에 삽입하고 싶습니다.

모든 필드에 대해 키를 만드는 것보다 더 좋은 방법이있을 수 있습니다. 내가 그렇게했다면 날짜, 문자열, 값 등이 모두 키를 형성하기 위해 섞여 있어야한다는 것을 의미합니다.

밖으로 행을 쿼리 내 입력 라인의 해시와 비교를 위해 해시 값은 다른 생각을했지만, 성능은 내가 :)

누구나 가장이 작업을 수행하는 방법에 대한 제안을 확신 끔찍한 것입니까?

감사

답변

2

당신은 제외하고 사용할 수 있습니다 : 속는이 일어나는 경우

insert into TargetTable 
select fieldlist from SourceTable 
except 
select fieldlist from TargetTable; 
+0

고마워요, 예외를 제외하고 이상적입니다! – Glinkot

+0

쿨 ...이 SQL Server에서 사용할 수 있는지 몰랐어요 (분명히 2005 +). +1. – codekaizen

5

가져 오는 경우에, 당신은 당신의 목표 테이블과 동일한 스키마를 가지고 임시 테이블에 삽입 한 다음에 SELECT DISTINCT 쿼리를 실행하여 데이터를 드 - 복제 무대를 만들 수 있습니다 이 쿼리의 결과를 최종 대상 테이블에 삽입합니다. 수천만 개의 행에 대해 이야기하지 않는 한, 이것은 단지 한 번 실행되어야하기 때문에 정상적으로 작동합니다.

+0

안녕 codekaizen,이 입력 파일을 중복 제거 것입니다,하지만 난 제안 된 입력 라인 (DB를 테이블에 존재하는지 확인하는 것을 목표로하고있어 어떤 이미 이전 파일의 레코드가있을 것입니다. 그 중 일부는 텍스트 파일의 것과 동일 할 수도 있습니다. – Glinkot

+0

그럼에도 불구하고 임시 테이블을 사용해야합니다. 주 테이블에 삽입하기위한 조건을 "not exists (select * from main table 어디에서 ...) ". – Arvo

+0

@Arvo가 맞습니다. 기존 행이 중복 제거 된 후 다른 단계가 될 수 있는지 확인하십시오. 들어오는 데이터뿐만 아니라 기존 데이터 세트에 대해서도 확인하고 싶은지 여부는 분명하지 않았습니다. 일반적으로 이와 같이 입력을 준비하면 더 많은 요구 사항이 추가되므로 향후 유지 관리 및 추가가 용이합니다. – codekaizen