반응형

RowNumber 파생열 구현하기

 

한대성

MS SQL Server MVP

에이디컨설팅 책임 컨설턴트 | SQLLeader.com 운영자

 

 

 

 Question

제가 하고자 하는 질문은

'|'구분자를 가지는 TEXT파일의 원본을 가지고 OLE DB 넣고자합니다.

그냥 DB 넣는게아니라 필드를 이용하여 새로운 필드를 추가하여 넣는것입니다.

openrowset 이용하여 쿼리문으로 넣는건 만들었는데 SSIS 이용하자니 막히네요.

제가 openrowset에서 사용했던 쿼리는 아래와 같습니다.

select left('AA980020000000' , 13-len(row_number() over(order by A_NO)))
     + cast(row_number() over(order by A_NO)  as varchar(10)) AS 'KEY'

 

설명을 드리자면 A_NO필드를 기준으로 row_number 생성합니다. 숫자형태임으로 형변환을 하고

KEY필드의 자리수는  14자리 고정임으로 'AA980020000000'에서 row_number 자리수만큼을 빼고 row_number 넣어주는 것입니다.

 

필드명만 바꿔서 select해보시면 어떤 형태를 원하는건지 아실수있으실것입니다.

 

위와같은 방법을 SSIS 적용하고자하는데 [파생열 변환] 이용했습니다. 근데 거기서는 over row_number 함수에 대한 제약이 있는듯한다.

위와같은 방법을 실현할수 있는방법이 궁금합니다.  

 

 

질문하신 사항으로 하기 위해서는 입력 데이터에 대해 Row_Number 기능이 구현되어야 합니다. Row_Number 간단히 구현하는 방법으로는 스크립트 변환 이용하면 됩니다.

 

1. 다음과 같은 텍스트 파일을 원본 데이터로 이용하겠습니다.

 

2. AA980020000000라는 값이 상황에 따라 바뀔 것도 같습니다. 값을 변수에 저장하도록 합시다. 만약 값이 변하더라도 변수의 값만 변경하면 되겠지요.

제어 흐름 영역의 곳을 선택한 , 마우스 오른쪽 클릭해서 나타나는 메뉴 변수(S) 선택하고선 KeyCol이라는 String 변수를 하나 추가하고, 기본 값으로 AA980020000000 설정합니다.

 

 

3. 데이터 흐름 작업 추가한 , 해당 데이터 흐름 영역에서 플랫 파일 원본 추가한 , 위의 텍스트 파일에 대한 열을 설정합니다.

 

4. 스크립트 구성 요소(변환) 추가한 , 플랫 파일 원본 연결합니다.

 

5. 스크립트 구성 요소 더블 클릭해서 편집기를 다음, 입력 탭에서 사용 가능한 입력 부분을 체크합니다.

 

6. /출력 탭에서 출력 0 부분을 확장한 , 출력 선택하고선, 아래에 있는 추가(C) 클릭해서 새로운 열을 하나 추가합니다. 새로 추가한 이름은 RowNum이라 하고, DataType 부호 없는 4바이트 정수(DT_I4) 설정합니다.

 

7. 스크립트 탭에서 스크립트 디자인(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

 

    Dim i As Integer

 

    Public Overrides Sub 입력0_ProcessInputRow(ByVal Row As 입력0Buffer)

        i = i + 1

        Row.RowNum = i

 

    End Sub

 

    Public Sub New()

        i = 0

    End Sub

End Class

 

 

 

, 여기까지가 RowNumber 추가하는 부분을 구현하였습니다. VB.net 스크립트라서 복잡하게 보이지만, 하다 보면 금방 익숙해지실 것입니다.

 

 

8. 이제, 도구 상자에서 파생 변환을 추가한 , 스크립트 구성 요소 연결합니다.

 

9. 파생 변환 편집기에서 다음과 같은 파생 열을 추가합니다.

 

: SUBSTRING(@[사용자::KeyCol],1,14 - LEN((DT_STR,14,949)RowNum)) + ((DT_STR,14,949)RowNum)

 

10. 추가된 데이터를 확인해 보면 다음과 같습니다.

 

 

 

 

SSIS 파생 변환을 이용해서 이와 같이 구현하시면 됩니다.

하지만~!! 복잡합니다.

 

이러한 방법은 어떨까요?

 

6단계부터 다음과 같이 봅시다.

6’. RowNum 뿐만 아니라 Key라는 열까지 추가합니다. KeyCol 열은 String, 14자리로 설정합니다.

 

7’. 스크립트 탭에서 ReadOnlyVariables 부분에 KeyCol이라고 입력한 , 아래 스크립트 디자인(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

 

    Dim i As Integer

    Dim keyStr As String

 

    Public Overrides Sub 입력0_ProcessInputRow(ByVal Row As 입력0Buffer)

        i = i + 1

        keyStr = Me.Variables.KeyCol.ToString

 

 

        Row.RowNum = i

        Row.Key = keyStr.Substring(0, keyStr.Length - i.ToString.Length) + i.ToString

 

    End Sub

 

    Public Sub New()

        i = 0

 

    End Sub

End Class

 

 

 

 

스크립트 구성 요소가 어렵게 보일 수도 있지만, 복잡한 로직을 간단히 구현할 있는 유용한 기능입니다.

 

 

반응형

'연구개발 > DTS & SSIS' 카테고리의 다른 글

루핑 처리 방법  (0) 2011.08.27
동적 대상 설정하기  (0) 2011.08.27
잠긴 파일 처리  (0) 2011.08.27
스크립트 변환으로 RowNumber 구현하기  (0) 2011.08.27
TEXT 형이 포함된 Excel 데이터 가져오기 문제  (0) 2011.08.27

+ Recent posts