2012-02-23 2 views
1

중복 레코드가 포함 된 일별 CSV가 수신됩니다. BULK INSERT를 사용하여 가져 오기를 시도했지만 중복으로 인해 기본 키 제약 조건에서 오류가 발생합니다.SQL Server 2008에서 고유 레코드 가져 오기

INSERT INTO final_table(col1, col2, col3) 
SELECT DISTINCT col1, col2, col3 
FROM temporary_table 

이 이것에 대해가는 가장 좋은 방법 :이 문제를 해결하려면

, 나는 기본 키 제약 조건 새 테이블로 데이터를 가져 오기, 다음 코드를 사용하는 방법에 대해 생각하고있어? 또는 SQL Server 2008에서이 작업을 수행하는 더 쉬운 방법이 있습니까?

+0

당신이 중복으로하기를 원하십니까? 그들을 제거하거나 무시합니까? –

+0

인덱스를 사용하지 않고 테이블에 BCP'ing하는 것이 좋습니다. 그러면 IGNORE_DUP_KEY가 설정된 인덱스를 추가하여 –

+0

을 완전히 제거하고 싶습니다. 준비 테이블 방법은 지금까지 작동하는 것 같습니다. 감사! – eek142

답변

2

이 "새"테이블을 스테이징 테이블이라고합니다. 그것은 거의 제한이 없어야합니다 ... 즉. 제약 조건. 일단 거기에로드되면, 사용자는 "최종"테이블을 스크럽하고로드합니다.

내가 제안하는 것이 가장 간단하다고 생각합니다. SSIS를 사용하고 있고 스테이징 테이블을 사용하지 않는다는 것에 신중하지 않는 한. 나는 무언가가 잘못 될 경우 파일의 정확한 복제본을 볼 수 있도록 준비 테이블을 가지고있는 것이 일반적입니다. 문제 해결에 도움이됩니다.

+0

스테이징 테이블이 실제 테이블이어야합니까, 아니면 임시 테이블을 사용할 수 있습니까? – eek142

+0

기술적으로 #tmp 테이블은 tempdb에있는 테이블입니다. 그러나 세션 관련이므로 bulkinserting 전에 "table #tmp"를 만들 수 있습니다. –

+0

나는 일반적으로 내 ETL 프로세스에서 지속되는 스테이징 테이블을 가지고 있습니다. 따라서 원시 데이터에 액세스 할 수 있습니다. 그러나이 시나리오에서는 중복을 없애려고하기 때문에 문제가되지 않습니다. –

1

이 시도 :

INSERT INTO final_table 
SELECT DISTINCT csv.* 
FROM OPENROWSET(BULK N'C:\Text1.csv', SINGLE_CLOB) AS csv 
+0

다음 오류가 발생합니다 : INSERT 문의 선택 목록에 삽입 목록보다 적은 항목이 있습니다. SELECT 값의 수는 INSERT 컬럼의 수와 일치해야합니다. 나는 다음과 같은 코드를 실행하려고 할 때입니다 :. DISTINCT CSV를 선택 final_table (col1, col2, col3)로 INTO INSERT를 * OPENROWSET FROM (BULK의 N'C : \ Text1.csv ', SINGLE_CLOB) CSV AS CSV 어딘가에 쉼표 구분 기호를 언급해야합니까? – eek142

+0

필자가 이해할 수있는 방식으로 코드를 작성 했으므로 final_table의 테이블 정의와 일치하는 select 열을 지정해야합니다. – pistipanko

+0

"csv"테이블에서 열을 어떻게 정의 할 수 있습니까? 파일에서 직접 삽입하지 않습니까? final_table (col1, col2, col3)과 같은 final_table에 대한 열을 지정했습니다. – eek142

관련 문제