세미나랑 프로젝트랑 기타 등등 여러 일들로 인해 글이 좀 뜸했네요~^^
이번 테크넷 브리핑 세미나에서도 잠깐 데모 보여드렸던 내용인데요. 스크립트 변환을 이용하여 비표준화된 데이터에 대한 처리 방법을 구현한 것입니다. MSDN에 추가된 내용을 바탕으로 한 번 만들어 보았습니다.
여기서 비표준화된 형태란, 다음과 같이 테이블과 같은 형태가 아닌 데이터를 말합니다.
############################################################## Package Name = 05_수행시간측정 Package Description = Package Start Time = 2006-10-31 11:05:52
Container Name = 병렬 수행 Container Description = 스크립트 작업 Start Container Time = 2006-10-31 11:05:52 End Container Time = 2006-10-31 11:05:52 ##Duration = 00:00:00
Container Name = 대기 Container Description = 스크립트 작업 Start Container Time = 2006-10-31 11:05:52 End Container Time = 2006-10-31 11:05:52 ##Duration = 00:00:00
Container Name = 데모 시퀀스 컨테이너 Container Description = 시퀀스 컨테이너 Start Container Time = 2006-10-31 11:05:52 End Container Time = 2006-10-31 11:05:58 ##Duration = 00:00:06
Package End Time = 2006-10-31 11:05:58
############################################################## ## Total Package Duration = 00:00:06 ##############################################################
|
이와 같은 입력 데이터에 대해 다음과 같은 테이블 형태의 모양으로 변환하고자 할 때,
PackageName |
ContainerName |
ContainerDescription |
StartTime |
EndTime |
Duration |
05_수행시간측정 |
병렬 수행 |
스크립트 작업 |
2006-10-31 11:05:52 |
2006-10-31 11:05:52 |
00:00:00 |
05_수행시간측정 |
대기 |
스크립트 작업 |
2006-10-31 11:05:52 |
2006-10-31 11:05:52 |
00:00:00 |
데이터 흐름 영역에 포함된 스크립트 변환 작업을 이용하여 수행할 수 있습니다.
행 단위로 텍스트 데이터를 읽은 후, 스크립트 변환 작업에서 행을 분석한 후, 잘라내어 출력시키는 방식입니다.
스크립트 변환에서 주의할 점은, 출력 부분에서 SynchronousInputID 값을 0으로 설정해 주는 것입니다. 이는 입력 버퍼와는 별도로 출력 버퍼를 사용하도록 지정하는 것입니다.(비동기 방식)
스크립트 부분은 다음과 같습니다.
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
Dim PackageName As String
Public Overrides Sub 입력_ProcessInputRow(ByVal Row As 입력Buffer) ' ' Add your code here ' Dim colName As String Dim colValue As String
If Row.열.Trim.Length > 0 And Row.열.IndexOf("=") > 0 Then
colName = Row.열.Substring(0, Row.열.IndexOf("=")).Trim
If Row.열.Substring(0, Row.열.IndexOf("=")).TrimEnd.Length > 1 Then
colValue = Row.열.Substring(Row.열.IndexOf("=") + 1).Trim Select Case colName Case "Container Name" Me.출력Buffer.AddRow() Me.출력Buffer.ContainerName = colValue Me.출력Buffer.PackageName = PackageName Case "Container Description" Me.출력Buffer.ContainerDescription = colValue Case "Start Container Time" Me.출력Buffer.StartTime = CDate(colValue) Case "End Container Time" Me.출력Buffer.EndTime = CDate(colValue) Case "##Duration" Me.출력Buffer.Duration = colValue Case "Package Name" PackageName = colValue End Select
End If
End If End Sub
End Class |
SSIS에서는 기존 버전에 비해 다양한 변환 작업들이 제공되기 때문에 스크립트 작업을 많이 할 필요는 없습니다. 하지만, 그렇다고 해서 안 쓸 필요는 없겠지요~^^ VB.net의 막강한 기능들을 최대한 사용할 수 있다는 것이 장점이겠지요.. 뿐만 아니라, 스크립트 작업들이 Compile 된 상태로 처리가 되기 때문에 이전 보다는 훨~씬 성능이 우수합니다..(물론 패키지의 사이즈는 조금 커지겠지요~..)
첨부하는 패키지 파일 및 데모 입력 파일을 이용해서 테스트 해 보시기 바랍니다..
'연구개발 > DTS & SSIS' 카테고리의 다른 글
유니코드 형을 일반 문자형으로 변환하기 (0) | 2011.08.27 |
---|---|
FOR 루프 컨테이너를 이용한 대기 작업 구현 (0) | 2011.08.27 |
패키지 실행 시 매개변수 동적으로 주기 (0) | 2011.08.27 |
병렬로 쿼리 실행하기 (0) | 2011.08.27 |
문자열의 코드 변환하기 (0) | 2011.08.27 |