2016-06-29 2 views
1

테이블 데이터를 각각 5000 개의 레코드 만 포함 된 파일로 플랫 파일 (.csv 형식)로 내 보내야합니다. 테이블에 10000 개의 레코드가있는 경우 각각 5000 개의 레코드가있는 2 개의 파일을 만들어야합니다. 테이블의 기록은 매일 증가합니다. 그래서 기본적으로 각각 5000 개의 레코드로 "n"개의 레코드를 "n"개의 파일로 내보내는 동적 인 솔루션을 찾고 있습니다.SSIS - 테이블 데이터를 청크 파일로 플랫 파일로 내보내기

* 간단한 시각화 : 테이블에 10230 개의 레코드가 있다고 가정합니다. 내가 뭘해야 할 것은 :

File_1.csv - 1 5000 기록

File_2.csv - 5001 만 개 기록

File_3.csv에 - 10001 내가 BCP를 시도

10230 개 기록 *에 위에서 언급 한 논리에 대한 명령. 데이터 흐름 태스크를 사용하여이 작업을 수행 할 수 있습니까?

+0

이 답변보기 ['일괄 내보내기 데이터 SSIS'] (http://stackoverflow.com/questions/23323311/batch-export-data-ssis) –

답변

1

아니요, SSIS가 기본적으로 잘 지원하지는 않습니다.

대상으로 사용되는 스크립트 태스크 또는 스크립트 구성 요소는이를 수행 할 수 있지만 필요한 모든 파일 조작을 통해 휠의 상당 부분을 다시 발명 할 수 있습니다.

첫 번째 단계는 소스에서 오는 모든 행에 반복 가능한 방식으로 행 번호를 추가하는 것입니다. SELECT *, ROW_NUMBER() OVER (ORDER BY MyTablesKey) AS RN FROM dbo.MyTable

ForEach 방식을 사용하면 각 행과 관련된 값이 단조롭게 증가하므로 referenced 대답을 사용하여 주어진 범위의 데이터를 가져올 수 있습니다.

데이터의 버킷/파일 수에 대해 합리적인 상한선을 만들 수있는 경우 일부 분석 함수를 사용하여 그룹화 크기를 지정할 수 있습니다. 그런 다음 모든 데이터가 데이터 흐름에 입력되고 조건부 분할로 인해 상한값의 출력 버퍼가 플랫 파일 대상으로 향하게됩니다.

대체 방법은 파일을 그대로 내보내고 PowerShell과 같은 것을 사용하여 작은 단위로 분할하는 것입니다. 유닉스는 이런 종류의 일을위한 고유 한 방법으로 split을 가지고 있기 때문에 멋지다.

+0

제안 해 주셔서 감사합니다. ROW_NUMBER() 함수를 사용하여 행 번호를 먼저 가져온 다음 SQL의 BETWEEN 절에 값을 전달합니다. 그래서 내 쿼리는 당신이 말한 것과 비슷한 것이 될 것입니다 :) – intel0201

0

글쎄, 표준 SSIS 구성 요소 및 SQL 2012+로 수행 할 수 있습니다. 아이디어는 다음과 같습니다. SELECT ... ORDER BY ... OFFSET <Row offset> ROWS FETCH NEXT <Row number> ROWS을 버킷 소스로 사용하고 FOR 컨테이너 및 표현식이 포함 된 플랫 파일 대상과 함께 사용하십시오.
자세한 내용 : 연결 문자열이`\ "파일 이름 _"+ [사용자 :: 반복자] + "의 표현으로 정의 0의 초기화 값과 플랫 파일 대상으로 반복자 INT 변수를

  1. 만들기 패키지로 제공된다. csv ". 또한 Bucket_size 변수 또는 매개 변수를 int로 정의하십시오.
  2. 루프 시퀀스 컨테이너 용으로 작성하십시오. 현재 매개 변수를 비워 둡니다. 다음 단계는 For Loop 안에 있습니다.
  3. 루프 컨테이너 (또는 최대 패키지 수준)에서 "SELECT count(*) FROM ... ORDER BY ... OFFSET "+(DT_WSTR,20)[User::Iterator]*[User::Bucket_Size]+" ROWS "으로 SQL_rowcount 변수를 만듭니다. 이 명령은 현재 버킷에서 나머지 행 수를 제공합니다.
  4. 작업 만들기 SQL_rowcount 변수의 명령으로 SQL 명령 실행을 실행하고 단일 결과를 변수 Bucket_Rowcount에 저장합니다.
  5. "SELECT .. FROM ... ORDER BY ... OFFSET "+(DT_WSTR,20)[User::Iterator]*[User::Bucket_Size]+" ROWS FETCH NEXT "+(DT_WSTR,20)[User::Bucket_Size]+" ROWS"을 사용하여 문자열 변수 SQL_bucket을 만듭니다.
  6. 간단한 데이터 흐름 작업 - SQL_bucket 변수의 명령과 OLEDB 원본 및 1 단계의 플랫 파일 대상을 만듭니다.
  7. 이제 약간의 트릭 - 루프 조건을 정의해야합니다. 현재 버킷 행 개수를 기준으로 계산합니다. 마지막 버킷은 버킷 크기 행을 넘지 않습니다. 연속 조건 (루프 항목 앞에서 확인) - 마지막 반복에는 버킷 행 이상이 있습니다 (다음 반복을 위해 적어도 1 행 남음). @Bucket_Rowcount = @Bucket_Size + 1
  8. EvalExpression - - @Bucket_Rowcount> @Bucket_Size
  9. AssignExpression - @Iterator = @Iterator + 1

  10. 그래서, For 루프 컨테이너
    • InitExpression에 대해 다음 속성을 정의

이것은 그 것이다.
내보내기 중에 원본 테이블이 수정되지 않으면 최적화 할 수 있습니다. 먼저 (For 루프 전에) 행 수를 가져오고 버킷 수를 계산하고이 반복 횟수를 수행합니다. 따라서 루프에서 select count (*) 문을 반복하지 마십시오.

+0

- 감사합니다. 그것은 나를 위해 일했다 :) – intel0201

관련 문제