2016-09-09 4 views
0

나는 행 수와 함께 폴더 디렉토리에서 모든 파일 이름을 가져 오려고합니다. (가능하면 파일 크기도 바이트로) Microsoft Visual Studio 2010 Shell을 사용하고 있습니다. 여기에 지금까지 한 일이다 :SSIS의 다른 열이있는 여러 플랫 파일에서 플랫 파일 이름을 얻고 행 수를 계산하려면 어떻게합니까?

내가하는 Foreach 루프 컨테이너을 만든 내가 루프를 통해 원하는 폴더로 변수에 의 Foreach File 열거 및 표현에 열거를 설정합니다. 파일 섹션을 *.*으로두고 Name Only을 검색하도록 요청했습니다. 변수 매핑을 FullFilePath이라는 새 변수로 변경했습니다. 컨테이너는 Package이고 값 유형은 String이며 값 :는 비어 있습니다.

그런 다음 데이터 흐름을 루프에 추가했습니다. 플랫 파일 원본, 행 수 및 OLE DB 대상을 추가했습니다. 플랫 파일 소스 속성 식을 Foreach 루프 컨테이너 식의 동일한 폴더 변수로 변경했습니다. 변수 RecordCount을 행 수 기능 (Int32, 값 0)에 추가했습니다. OLE DB 대상은 OLE DB 대상이라는 새 테이블을 만듭니다.

다음 단계는 실행 SQL 작업이며 Insert Into DBO.FileData (FileName,RowCount) Values (?,?)입니다. 2 매개 변수 매핑을 설정합니다. 1) Foreach 루프 컨테이너의 변수 이름, FullFilePath 및 VarChar 데이터 형식, 2) 행 개수, RecordCount 및 Long 데이터 형식의 변수.

그렇다면 데이터 흐름 태스크가 생성 한 테이블을 삭제하는 SQL 실행 태스크을 실행하십시오. 문제는이 모든 단계에서 패키지가 여전히 완료되지 않는다는 것입니다. 실제로 중단되어 사전 실행시 실패합니다. 그것은 말합니다 :

Warning: Access is denied. Error: Cannot open the datafile 'FullFilePath' Error: Flat File Source failed the pre-execute phase and returned error code 0xC020200E.

내가 잘못하고있는 것으로 보이는 것이 있습니까? 사진이 도움이되는지 알려주세요.

+0

첫 번째로 플랫 파일 소스에 전체 경로와 파일 이름을 전달해야 할 경우 폴더에 전달할 수 없습니다. 두 번째로 foreach 루프에서 생성 된 파일 이름을 현재 플랫 파일 원본에 대해 설정된 폴더 경로에 추가해야합니다. 이는 플랫 파일 소스에 표현식 (연결 문자열)을 통해 설정됩니다. 그 모든 것을 제외하고는 데이터 흐름과 개념을 사용하여 읽고있는 각 파일의 메타 데이터를 변경해야합니다. 당신은 스크립트 작업에서 그 일을하는 것이 훨씬 낫습니다. 객체 변수를 반환하는 것 – SFrejofsky

+0

@SFrejofsky 알아 냈습니다. 입력 해 주셔서 감사합니다. –

답변

0

그래서 나는 이것을 알아 냈습니다. 다양한 헤더와 열 개수로 모든 파일을 반복하기 위해 플랫 파일 소스의 옵션을 변경하여 "파일에 헤더가 없습니다"옵션을 선택했습니다. 이렇게하면 모든 파일에 기본적으로 Column 0 (모든 파일에서 첫 번째 열은 일종의 숫자 필드 또는 ID 임) 인 동일한 # 1 열을 가질 수있었습니다. 행 수를 통해이를 매핑하고 SQL 테이블에 삽입 할 수있었습니다. 그런 다음 Foreach 루프를 완료하고 파일 이름과 행 수를 다른 SQL 테이블에 기록하여 개수를 기록 할 수있었습니다. 그러나 실제로는 정말 오랜 시간이 걸립니다. 즉, 14 시간 이상 실행되었으며 13 개의 파일을 통해서만 계산되었습니다. 일부 파일에 250K + 행이 부여되지만이 시간이 오래 걸릴 것이라고는 생각하지 않습니다.

+0

오래 걸리지 않아야합니다. 그렇게 오래 걸리는 유일한 이유는 foreach 루프가 올바르지 않고 파일 방식을 너무 많이 반복하는 경우입니다. 저는 많은 파일에 대해 수백만 건의 레코드를 처리했습니다. 단지 한 시간 정도 걸렸습니다. 데이터 흐름을 모니터링하여 데이터가 중복되지 않았는지 확인하기 위해로드중인 테이블을 확인하거나 대량의 시간을 어디에 사용했는지 확인 했습니까? – SFrejofsky

+0

@SFrejofsky 패키지 프로세스를 거쳐 'Column 0'을 OLE DB 테이블에 쓰는 데 가장 오랜 시간이 걸리는 것을 보았습니다. 필자가 작성한 테이블을 확인한 결과 중복되지 않았습니다. 플랫 파일에서 작성한 다음 루프가 완료된 후 테이블을 자릅니다. 패키지를 'Raw File Destination'을 사용하도록 변경했으며 2 시간 이내에 훨씬 빨리 완료되었습니다. 다 잘됐다! SQL 서버에 쓰기 위해 왜 그렇게 오랜 시간이 걸렸는지 모르겠다. 원격 서버로 돌리고 있기 때문일까? 아니면 서버가 바빴 을까요? –

관련 문제