스크립트 변환에서 오류 처리하기
한대성
Question
문의드리고 싶은 것은 스크립트 변환 에서 오류가 발생하였을 경우,
그 원본 행을 DB의 다른 테이블에 저장시켜두고 에러메시지도 같이 포함해두고 싶습니다.
원
본은 csv 파일이고, 스크립트 변환에서 일부 문자열 파싱 작업이후 DB에 넣는데, 구조적이지 않은 문자열이라서 예외가
상당히많아서 에러가 발생하면 처리하던 원본행을 db에 넣고, 기존 작업은 그대로 진행시키는 방식으로 구현하려 합니다. (차후에
에러난것만 다시 확인해서 처리)
(참고로 다수의 원본파일을 처리해야해서 foreach 루프컨테이너 안에 데이터 변환작업으로 처리하고 있습니다.)
oledb 나 조회변환은 오류처리가 쉽게 되는데, 스크립트 변환은 어찌 처리해야될지 모르겠습니다;;
다음과 같은 입력 데이터에 대해 스크립트 변환에서의 오류 처리를 구현해 보겠습니다.
스크립트 변환을 이용한연산 :
(OutputCol) = 120 / (InputCol)
입력 데이터 :
InputCol |
구분 |
1 |
정상 |
2 |
정상 |
3 |
정상 |
aaa |
오류 : 숫자 데이터여야 하는데 문자 |
0 |
연산 과정에서 0으로 나누기 오류 |
4 |
정상 |
5 |
정상 |
다음과 같이 데이터 흐름에서 간단한 원본 데이터를 만듭니다.
원본에 대해 스크립트 변환을 추가한 후 연결합니다.
스크립트 변환 편집기의 입력 열 탭에서 입력에 사용할 열을 선택한 후, 입/출력 탭에서 다음과 같이 작업을 설정합니다.
① 출력 0 부분에 OutputCol 이라는 4바이트 정수형 열을 추가합니다.
② 출력 0 을 선택한 상태에서 ExclusionGroup 값을 0 이외의 값을 설정합니다.
③ SynchronousInputID 의 값이 기본 값인 입력 “입력 0”(XX) 으로 설정되었는지 확인합니다.
이제, 오류 데이터를 출력하는 것을 구현합니다.
아래에 있는 출력 추가(A) 버튼을 클릭해서 출력을 추가한 후 Error로 이름을 변경합니다. (안해도 됩니다.^^)
① 이 출력에 대해서도 위와 같이 ExclusionGroup의 값을 0 이외의 다른 값(앞에서 설정한 것과도 다른 값)으로 설정하고, SynchronousInputID의 값도 위와 같이 설정합니다.
② 출력 열 부분에 ErrorDesc라는 이름의 문자형 변수를 추가합니다. (적절한 길이로 설정합니다.)
이제 스크립트 탭에서 스크립트 디자인(S)을 클릭해서 VSA를 연 후, 다음과 같은 스크립트를 입력합니다.
Imports System Imports System.Data Imports System.Math Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper Imports Microsoft.SqlServer.Dts.Runtime.Wrapper
Public Class ScriptMain Inherits UserComponent
Public Overrides Sub 입력0_ProcessInputRow(ByVal Row As 입력0Buffer)
Dim Output As Integer Try Output = CInt(120 / CInt(Row.InputCol))
' 정상인 경우 출력하는 부분 Row.OutputCol = Output ' 정상 출력 결과 Row.DirectRowTo출력0()
Catch ex As Exception ' 에러인 경우 출력하는 부분 Row.ErrorDesc = ex.Message ' 에러 메시지 Row.DirectRowToError()
End Try
End Sub
End Class
|
자, 이제 스크립트 변환에 대상이나 다른 변환을 추가할 경우, 하나의 녹색 선이 아닌 두 개의 경로 중 선택하는 창이 나타납니다. (조건부 분할과 유사함)
이를 다음과 같이 대충 구성한 다음 처리 결과를 확인해 봅시다.
* 입력 데이터
* 정상 처리된 데이터
* 오류 처리된 데이터 및 에러 원인 데이터
![](http://www.sqlleader.com/Pds/Board/SS2005SSIS/Editor/888%5B2%5D.jpg)
'연구개발 > DTS & SSIS' 카테고리의 다른 글
패키지 내의 연결 정보 읽어오기 (0) | 2011.08.27 |
---|---|
자식 패키지의 연결 정보 변경하기 (0) | 2011.08.27 |
[DTS] 데이터 로딩 과정에서 필터링 하기 (0) | 2011.08.27 |
동일한 구조의 테이블로 결과 보내기 (0) | 2011.08.27 |
FTP 작업에서 파일 없는 경우 처리 방법 (0) | 2011.08.27 |