2009-06-15 2 views
2

흥미로운 점은 인쇄용 명세서 데이터 (예 : 유틸리티 청구서, 은행 명세서)를 사전 처리하기위한 ETL 도구를 평가하는 것입니다.SSIS 트랜잭션 데이터 (다른 레코드 유형, 하나의 파일)

일부 데이터는 서로 다른 레코드 유형의 단일 플랫 파일로 전달됩니다.

첫 번째 필드가 "01"인 레코드 유형은 주소 데이터입니다. 여기에는 이름과 주소 필드가 있습니다. "02"가있는 레코드 유형은 잔액 및 합계가있는 요약 데이터입니다. 레코드 유형 "03"은 명령문의 라인 항목입니다.

각 명령문에는 하나의 01 및 02 레코드와 여러 개의 03 레코드가 있습니다. 파일을 미리 파싱하고 테이블로로드하기 위해 3 개의 파일로 분할 할 수 있지만 이상적이지 않습니다.

파일을 가져 와서 몇 가지 조작을합니다 (예 : 주소 레코드에 몇 개의 필드를 추가하고 합계/유효성 검사를 한 다음). 거의 동일한 형식으로 파일을 보냅니다. 추가 된 필드가 포함 된)를 인쇄 구성 프로그램에 추가하십시오.

SSIS에서 어떻게합니까?

답변

0

이것은 가능합니다. 사용자 지정 논리를 작성해야합니다. 나는 이것을 DTS와 함께 한 번했다. 파일이 구분 된 경우 SSIS는 필드를 올바르게 가져옵니다. 레코드 유형 필드를 검사 한 다음 레코드 유형에 따라 다른 삽입으로 분기하는 스크립트를 작성할 수 있습니다. 파일에 구분되지 않은 레코드가 있지만 각 유형마다 고유 한 너비가있는 경우 스크립트에서 레코드 유형과 너비가 하드 코드 된 상태에서 가져온 각 줄을 구문 분석하고 분할해야하므로 훨씬 더 복잡해집니다 .

+0

SSIS에서 사용자 정의 스크립트를 작성할 필요가 없습니다. 조건부 분할은 로직 만 필요로하는 단순한 if-then 프로세스이며 스크립팅은 필요하지 않습니다. – Eric

+0

고정 너비 파일은 어떻습니까? 열 이름이 아닌 데이터의 특정 위치를 열 수 있습니까? – cdonner

-1

몇 가지 방법이 있지만 가장 쉬운 방법은 원본 작업 다음에 조건부 나누기를 추가 한 다음 여러 가지 데이터 변환 작업을 통해 올바른 형식을 얻는 것입니다. 데이터.

소스가 올바른 데이터 유형으로 설정되어 있는지 확인하십시오 (예 : 모든 문자열). 그런 다음 조건부 분할의 "레코드 유형"필드를 선택하여 올바른 분기로 보냅니다.

+0

원본 데이터가 하나의 레이아웃 만 처리 할 수 ​​있기 때문에 원본 데이터를 사용하여 작업하는 일반적인 방법은 작동하지 않습니다. 케드의 대답을보십시오. – Sam

5

SSIS의 변형 레코드의 큰 문제는 연결 관리자가 단일 레이아웃 만 처리 할 수 ​​있기 때문에 레이아웃을 사용하는 연결 관리자의 이점을 얻지 못한다는 것입니다.

그래서 일반적으로 두 개의 열 (recordtype 및 recorddata)이있는 CRLF로 끝나는 플랫 파일로 끝납니다. 그런 다음 조건부 분할을 입력하고 각 유형의 행을 다른 경로에 구문 분석합니다. 구문 분석은 나머지 레코드 데이터를 나눠서 열에 넣고 파생 된 열 변환 또는 스크립트 변환 및 잠재적 변환 변환을 사용하여 정상적으로 변환해야합니다.

패키지를 많이 만들었 으면 이미 대상 유형으로 변환 된 3 개의 출력을 생성하는 사용자 정의 구성 요소 작성을 진지하게 고려할 것입니다.

+0

이런 종류의 작업을 처리 할 수있는 일반적인 사용자 지정 구성 요소가 있다고 가정하지 마십시오. 즉 '레코드 유형'입력란과 출력 입력란을 코딩하지 않고 지정 하시겠습니까? 그렇지 않으면 내 자신의 코드를 작성할 시간이 될 수 있습니다! – Dane

+0

나는 알고있다. 하나를 찾으면 내 "최고의 SSIS 구성 요소"질문을 추적하여 거기에 추가하십시오. –

3

내 질문에 답변 - 아래 스크립트를 참조하십시오. AcctNum은 플랫 파일 소스의 파생 된 열에서 들어오고 02 레코드 유형에 대해 올바르게 채워지며 로컬 정적 varialbe에 저장되고 acct 번호가없는 다른 레코드 유형의 행에 다시 저장됩니다.

/* Microsoft SQL Server Integration Services 스크립트 구성 요소 * Microsoft Visual C# 2008을 사용하여 스크립트를 작성하십시오. * ScriptMain은 스크립트의 진입 점 클래스입니다.*/

using System; using System.Data; using Microsoft.SqlServer.Dts.Pipeline.Wrapper; using Microsoft.SqlServer.Dts.Runtime.Wrapper;

[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute] 공용 클래스 ScriptMain : UserComponent { 정적 스트링 ACCOUNTNUMBER = NULL;

public override void PreExecute() 
{ 
    base.PreExecute(); 
    /* 
     Add your code here for preprocessing or remove if not needed 
    */ 
} 

public override void PostExecute() 
{ 
    base.PostExecute(); 
    /* 
     Add your code here for postprocessing or remove if not needed 
     You can set read/write variables here, for example: 
     Variables.MyIntVar = 100 
    */ 
} 

public override void Input0_ProcessInputRow(Input0Buffer Row) 
{ 
    if (Row.RecordType == "02") 
     AccountNumber = Row.AcctNum; // Store incomming Account Number into local script variable 
    else if (Row.RecordType == "06" || Row.RecordType == "07" || Row.RecordType == "08" || 
      Row.RecordType == "09" || Row.RecordType == "10") 
     Row.AcctNum = AccountNumber; // Put Stored Account Number on this row. 
} 

}

관련 문제