반응형


세미나랑 프로젝트랑 기타 등등 여러 일들로 인해 글이 좀 뜸했네요~^^

 

이번 테크넷 브리핑 세미나에서도 잠깐 데모 보여드렸던 내용인데요. 스크립트 변환을 이용하여 비표준화된 데이터에 대한 처리 방법을 구현한 것입니다. 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 된 상태로 처리가 되기 때문에 이전 보다는 훨~씬 성능이 우수합니다..(물론 패키지의 사이즈는 조금 커지겠지요~..)

 

첨부하는 패키지 파일 및 데모 입력 파일을 이용해서 테스트 해 보시기 바랍니다..

 

반응형

+ Recent posts