다음을 통해 공유


스크립트 구성 요소를 사용하여 동기 변환 만들기

적용 대상: Azure Data Factory의 SQL Server SSIS Integration Runtime

Integration Services 패키지의 데이터 흐름에서 변환 구성 요소를 사용하여 데이터가 원본에서 대상으로 전달될 때 데이터를 수정하고 분석합니다. 동기 출력이 있는 변환은 구성 요소를 통과할 때 각 입력 행을 처리합니다. 비동기 출력이 있는 변환은 처리를 완료하기 위해 모든 입력 행을 수신할 때까지 기다립니다. 이 항목에서는 동기 변환에 대해 설명합니다. 비동기 변환에 대한 자세한 내용은 스크립트 구성 요소를 사용하여 비동기 변환 만들기를 참조 하세요. 동기 구성 요소와 비동기 구성 요소 간의 차이점에 대한 자세한 내용은 동기 및 비동기 변환 이해를 참조하세요.

스크립트 구성 요소에 대한 개요는 스크립트 구성 요소를 사용하여 데이터 흐름 확장을 참조 하세요.

스크립트 구성 요소 및 이를 위해 생성하는 인프라 코드는 사용자 지정 데이터 흐름 구성 요소를 개발하는 프로세스를 크게 간소화합니다. 하지만 스크립트 구성 요소의 작동 방식을 이해하려면 사용자 지정 데이터 흐름 구성 요소 개발 섹션과 이 섹션의 동기 출력을 사용하여 사용자 지정 변환 구성 요소 개발에서 사용자 지정 데이터 흐름 구성 요소를 개발하는 데 필요한 단계를 파악하는 것이 좋습니다.

동기 변환 구성 요소 시작

SSIS 디자이너의 데이터 흐름 창에 스크립트 구성 요소를 추가하면 원본, 대상 또는 변환 구성 요소 유형을 선택하기 위한 스크립트 구성 요소 유형 선택 대화 상자가 열립니다. 이 대화 상자에서 변환을 선택합니다.

메타데이터 디자인 모드에서 동기 변환 구성 요소 구성

변환 구성 요소를 만드는 옵션을 선택한 후 스크립트 변환 편집기를 사용하여 구성 요소를 구성합니다. 자세한 내용은 스크립트 구성 요소 편집기에서 스크립트 구성 요소 구성을 참조하세요.

스크립트 구성 요소의 스크립트 언어를 설정하려면 스크립트 변환 편집기스크립트 페이지에서 ScriptLanguage 속성을 설정합니다.

참고 항목

스크립트 구성 요소에 대한 기본 스크립팅 언어를 설정하려면 옵션 대화 상자의 일반 페이지에서 스크립팅 언어 옵션을 사용합니다. 자세한 내용은 일반 페이지를 참조하세요.

데이터 흐름 변환 구성 요소에는 하나의 입력이 있으며 하나 이상의 출력을 지원합니다. 구성 요소에 대한 입력 및 출력 구성은 사용자 지정 스크립트를 작성하기 전에 스크립트 변환 편집기를 사용하여 메타데이터 디자인 모드에서 완료해야 하는 단계 중 하나입니다.

입력 열 구성

변환 구성 요소에서는 하나의 입력을 사용합니다.

스크립트 변환 편집기입력 열 페이지에서 열 목록에는 데이터 흐름에 있는 업스트림 구성 요소의 출력에서 사용 가능한 열이 표시됩니다. 변환하거나 전달할 열을 선택합니다. 현재 위치에서 변환할 모든 열은 읽기/쓰기로 표시합니다.

스크립트 변환 편집기입력 열 페이지에 대한 자세한 내용은 스크립트 변환 편집기(입력 열 페이지)를 참조하세요.

입력, 출력 및 출력 열 구성

변환 구성 요소는 하나 이상의 출력을 지원합니다.

스크립트 변환 편집기의 입력 및 출력 페이지에서 단일 출력이 만들어졌지만 출력에 열이 없음을 확인할 수 있습니다. 편집기의 이 페이지에서 다음 항목을 구성해야 하거나 구성할 수 있습니다.

  • 예기치 않은 값을 포함하는 행에 대한 시뮬레이트된 오류 출력과 같은 하나 이상의 추가 출력을 만듭니다. 출력 추가 및 출력 제거 단추를 사용하여 동기 변환 구성 요소의 출력을 관리합니다. 각 행을 한 출력 또는 다른 출력으로 리디렉션하도록 지정하지 않은 경우에는 모든 입력 행이 사용 가능한 모든 출력으로 전송됩니다. 출력에서 ExclusionGroup 속성에 대해 0이 아닌 정수 값을 지정하여 행을 리디렉션하려고 함을 나타냅니다. 출력을 식별하기 위해 ExclusionGroup에 입력된 특정 정수 값은 중요하지 않지만 지정된 출력 그룹에 대해 동일한 정수를 일관되게 사용해야 합니다.

    참고 항목

    모든 행을 출력하지 않으려는 경우 0 이 아닌 ExclusionGroup 속성 값을 단일 출력과 함께 사용할 수도 있습니다. 그러나 이 경우 출력으로 보낼 각 행에 대해 DirectRowTo<outputbuffer> 메서드를 명시적으로 호출해야 합니다.

  • 입력 및 출력에 보다 알기 쉬운 이름을 지정할 수 있습니다. 스크립트 구성 요소는 이러한 이름을 사용하여 스크립트의 입력 및 출력을 참조하는 데 사용할 형식화된 접근자 속성을 생성합니다.

  • 동기 변환의 경우 열을 그대로 둡니다. 일반적으로 동기 변환은 데이터 흐름에 열을 추가하지 않습니다. 데이터는 버퍼에서 수정되고 버퍼는 데이터 흐름의 다음 구성 요소에 전달됩니다. 이 경우 변환의 출력에 출력 열을 명시적으로 추가하고 구성할 필요가 없습니다. 출력은 명시적으로 정의된 열이 없는 편집기에서 나타납니다.

  • 행 수준 오류에 대한 시뮬레이션된 오류 출력에 새 열을 추가합니다. 일반적으로 동일한 ExclusionGroup 의 여러 출력에는 동일한 출력 열 집합이 있습니다. 그러나 시뮬레이션된 오류 출력을 만드는 경우 오류 정보를 포함할 열을 더 추가할 수 있습니다. 데이터 흐름 엔진이 오류 행을 처리하는 방법에 대한 자세한 내용은 데이터 흐름 구성 요소에서 오류 출력 사용을 참조 하세요. 스크립트 구성 요소에서 추가 열을 적절한 오류 정보로 채우려면 사용자 고유의 코드를 작성해야 합니다. 자세한 내용은 스크립트 구성 요소의 오류 출력 시뮬레이션을 참조하세요.

스크립트 변환 편집기입력 및 출력 페이지에 대한 자세한 내용은 스크립트 변환 편집기(입력 및 출력 페이지)를 참조하세요.

변수 추가

스크립트에서 기존 변수를 사용하려는 경우 스크립트 변환 편집기의 스크립트 페이지에 있는 ReadOnlyVariablesReadWriteVariables 속성 필드에 추가할 수 있습니다.

속성 필드에 여러 변수를 추가하는 경우 변수 이름을 쉼표로 구분하십시오. 또한 ReadOnlyVariablesReadWriteVariables 속성 필드 옆에 있는 줄임표(...) 단추를 클릭한 다음, 변수 선택 대화 상자에서 변수를 선택하면 여러 개의 변수를 선택할 수 있습니다.

스크립트 구성 요소에서 변수를 사용하는 방법에 대한 일반적인 내용은 스크립트 구성 요소에서 변수 사용을 참조 하세요.

스크립트 변환 편집기스크립트 페이지에 대한 자세한 내용은 스크립트 변환 편집기(스크립트 페이지)를 참조하세요.

코드 디자인 모드에서 동기 변환 구성 요소 스크립팅

구성 요소에 대한 메타데이터를 구성한 후 사용자 지정 스크립트를 작성할 수 있습니다. 스크립트 변환 편집기에서 스크립트 페이지에서 스크립트 편집을 클릭하여 사용자 지정 스크립트를 추가할 수 있는 VSTA(Microsoft Visual Studio Tools for Applications) IDE를 엽니다. 사용하는 스크립팅 언어는 스크립트 페이지에서 ScriptLanguage 속성 에 대한 스크립트 언어로 Microsoft Visual Basic 또는 Microsoft Visual C#을 선택했는지 여부에 따라 달라집니다.

스크립트 구성 요소를 사용하여 만든 모든 종류의 구성 요소에 적용되는 중요한 정보는 스크립트 구성 요소 코딩 및 디버깅을 참조 하세요.

자동 생성된 코드 이해

변환 구성 요소를 만들고 구성한 후 VSTA IDE를 열면 편집 가능한 ScriptMain 클래스가 ProcessInputRow 메서드에 대한 스텁과 함께 코드 편집기에 나타납니다. ScriptMain 클래스는 사용자 지정 코드를 작성하는 위치이며 ProcessInputRow는 변환 구성 요소에서 가장 중요한 방법입니다.

VSTA에서 프로젝트 탐색기 창을 열면 스크립트 구성 요소에서 읽기 전용 BufferWrapperComponentWrapper 프로젝트 항목도 생성했음을 확인할 수 있습니다. ScriptMain 클래스는 ComponentWrapper 프로젝트 항목의 UserComponent 클래스에서 상속됩니다.

런타임에 데이터 흐름 엔진은 UserComponent 클래스에서 ProcessInput 메서드를 호출합니다. 이 메서드는 부모 클래스의 메서드를 ScriptComponent 재정의합니다ProcessInput. ProcessInput 메서드는 입력 버퍼의 행을 반복하고 각 행에 대해 ProcessInputRow 메서드를 한 번 호출 합니다.

사용자 지정 코드 작성

동기 출력이 있는 변환 구성 요소는 작성할 모든 데이터 흐름 구성 요소 중 가장 간단합니다. 예를 들어 이 항목의 뒷부분에 표시된 단일 출력 예제는 다음 사용자 지정 코드로 구성됩니다.

Row.City = UCase(Row.City)  
Row.City = (Row.City).ToUpper();  
  

사용자 지정 동기 변환 구성 요소 만들기를 완료하려면 재정의된 ProcessInputRow 메서드를 사용하여 입력 버퍼의 각 행에 있는 데이터를 변환합니다. 데이터 흐름 엔진은 전체인 경우 이 버퍼를 데이터 흐름의 다음 구성 요소로 전달합니다.

요구 사항에 따라 ScriptMain 클래스에서 사용할 수 있는 PreExecutePostExecute 메서드에서 스크립트를 작성하여 예비 또는 최종 처리를 수행할 수도 있습니다.

여러 출력 작업

입력 행을 두 개 이상의 가능한 출력 중 하나로 보내려면 앞에서 설명한 단일 출력 시나리오보다 훨씬 더 많은 사용자 지정 코드가 필요하지 않습니다. 예를 들어 이 항목의 뒷부분에 표시된 두 개의 출력 예제는 다음 사용자 지정 코드로 구성됩니다.

Row.City = UCase(Row.City)  
If Row.City = "REDMOND" Then  
    Row.DirectRowToMyRedmondAddresses()  
Else  
    Row.DirectRowToMyOtherAddresses()  
End If  
Row.City = (Row.City).ToUpper();  
  
if (Row.City=="REDMOND")  
{  
    Row.DirectRowToMyRedmondAddresses();  
}  
else  
{  
    Row.DirectRowToMyOtherAddresses();  
}  

이 예에서 스크립트 구성 요소는 개발자가 구성한 출력의 이름을 따라 DirectRowTo<OutputBufferX> 메서드를 자동으로 생성합니다. 유사한 코드를 사용하여 오류 행을 시뮬레이션된 오류 출력으로 보낼 수 있습니다.

예제

이 예제에서는 동기 변환 구성 요소를 만들기 위해 ScriptMain 클래스에 필요한 사용자 지정 코드를 보여 줍니다.

참고 항목

이러한 예제에서는 AdventureWorks 샘플 데이터베이스에서 Person.Address 테이블을 사용하고 데이터 흐름을 통해 첫 번째 및 네 번째 열인 intAddressIDnvarchar(30)City 열을 전달합니다. 이 섹션의 원본, 변환 및 대상 예제에는 동일한 데이터가 사용됩니다. 각 예제에 대한 추가 필수 구성 요소 및 가정이 설명되어 있습니다.

단일 출력 동기 변환 예제

이 예제에서는 단일 출력이 있는 동기 변환 구성 요소를 보여 줍니다. 이 변환은 AddressID 열을 통과하고 City 열을 대문자로 변환합니다.

이 샘플 코드를 실행하려면 다음과 같이 패키지와 구성 요소를 구성해야 합니다.

  1. 데이터 흐름 디자이너 화면에 새 스크립트 구성 요소를 추가하고 변환으로 구성합니다.

  2. SSIS 디자이너에서 원본 또는 다른 변환의 출력을 새 변환 구성 요소에 연결합니다. 이 출력은 AdventureWorks 예제 데이터베이스의 Person.Address 테이블에서 AddressIDCity 열이 포함된 데이터를 제공해야 합니다.

  3. 스크립트 변환 편집기를 엽니다. 입력 열 페이지에서 AddressIDCity 열을 선택합니다. City 열을 읽기/쓰기로 표시합니다.

  4. 입력 및 출력 페이지에서 입력 및 출력의 이름을 MyAddressInput 및 MyAddressOutput같은 보다 설명적인 이름으로 바꿉니다. 출력의 SynchronousInputID는 입력의 ID해당합니다. 따라서 출력 열을 추가하고 구성할 필요가 없습니다.

  5. 스크립트 페이지에서 스크립트 편집을 클릭하고 다음 스크립트를 입력합니다. 그런 다음 스크립트 개발 환경 및 스크립트 변환 편집기를 닫습니다.

  6. SQL Server 대상 또는 스크립트 구성 요소를 사용하여 대상 만들기에서 보여 준 샘플 대상 구성 요소와 같이 AddressIDCity 열을 필요로 하는 대상 구성 요소를 만들고 구성합니다. 그런 다음 변환의 출력을 대상 구성 요소에 연결합니다. AdventureWorks 데이터베이스에서 다음 Transact-SQL 명령을 실행하여 대상 테이블을 만들 수 있습니다.

    CREATE TABLE [Person].[Address2]([AddressID] [int] NOT NULL,  
        [City] [nvarchar](30) NOT NULL)  
    
  7. 예제를 실행합니다.

Public Class ScriptMain  
    Inherits UserComponent  
  
    Public Overrides Sub MyAddressInput_ProcessInputRow(ByVal Row As MyAddressInputBuffer)  
  
        Row.City = UCase(Row.City)  
  
    End Sub  
  
End Class  
public class ScriptMain:  
    UserComponent  
  
{  
    public override void MyAddressInput_ProcessInputRow(MyAddressInputBuffer Row)  
    {  
  
        Row.City = (Row.City).ToUpper();  
  
    }  
  
}  

두 개의 출력을 사용하는 동기 변환 예

이 예제에서는 두 개의 출력이 있는 동기 변환 구성 요소를 보여 줍니다. 이 변환은 AddressID 열을 통과하고 City 열을 대문자로 변환합니다. 도시 이름이 Redmond이면 해당 행은 한 출력으로 전송되고 다른 모든 행은 다른 출력으로 전송됩니다.

이 샘플 코드를 실행하려면 다음과 같이 패키지와 구성 요소를 구성해야 합니다.

  1. 데이터 흐름 디자이너 화면에 새 스크립트 구성 요소를 추가하고 변환으로 구성합니다.

  2. SSIS 디자이너에서 원본 또는 다른 변환의 출력을 새 변환 구성 요소에 연결합니다. 이 출력은 적어도 AddressID 및 City 열을 포함하는 AdventureWorks 샘플 데이터베이스의 Person.Address 테이블에서 데이터를 제공해야 합니다.

  3. 스크립트 변환 편집기를 엽니다. 입력 열 페이지에서 AddressIDCity 열을 선택합니다. City 열을 읽기/쓰기로 표시합니다.

  4. 입력 및 출력 페이지에서 두 번째 출력을 만듭니다. 새 출력을 추가한 후 SynchronousInputID를 입력 ID설정해야 합니다. 이 속성은 기본적으로 만들어지는 첫 번째 출력에 이미 설정되어 있습니다. 각 출력에 대해 ExclusionGroup 속성을 0이 아닌 동일한 값으로 설정하여 두 개의 상호 배타적 출력 간에 입력 행을 분할함을 나타냅니다. 출력에 출력 열을 추가할 필요가 없습니다.

  5. MyAddressInput, MyRedmondAddresses 및 MyOtherAddresses와 같이 설명이 더 많은 이름을 사용하여 입력 및 출력의 이름을 바꿉니다.

  6. 스크립트 페이지에서 스크립트 편집을 클릭하고 다음 스크립트를 입력합니다. 그런 다음 스크립트 개발 환경 및 스크립트 변환 편집기를 닫습니다.

  7. SQL Server 대상, 플랫 파일 대상 또는 스크립트 구성 요소를 사용하여 대상 만들기에서 보여 준 샘플 대상 구성 요소와 같이 AddressIDCity 열을 필요로 하는 두 개의 대상 구성 요소를 만들고 구성합니다. 그런 다음 변환의 각 출력을 대상 구성 요소 중 하나에 연결합니다. AdventureWorks 데이터베이스에서 다음과 같이 고유한 테이블 이름으로 Transact-SQL 명령을 실행하여 대상 테이블을 만들 수 있습니다.

    CREATE TABLE [Person].[Address2] (
        [AddressID] INT NOT NULL,
        [City] NVARCHAR(30) NOT NULL
    );
    
  8. 예제를 실행합니다.

Public Class ScriptMain  
    Inherits UserComponent  
  
    Public Overrides Sub MyAddressInput_ProcessInputRow(ByVal Row As MyAddressInputBuffer)  
  
        Row.City = UCase(Row.City)  
  
        If Row.City = "REDMOND" Then  
            Row.DirectRowToMyRedmondAddresses()  
        Else  
            Row.DirectRowToMyOtherAddresses()  
        End If  
  
    End Sub  
  
End Class  
public class ScriptMain:  
    UserComponent  
  
public override void MyAddressInput_ProcessInputRow(MyAddressInputBuffer Row)  
    {  
  
        Row.City = (Row.City).ToUpper();  
  
        if (Row.City == "REDMOND")  
        {  
            Row.DirectRowToMyRedmondAddresses();  
        }  
        else  
        {  
            Row.DirectRowToMyOtherAddresses();  
        }  
  
    }  
}  

참고 항목

동기 및 비동기 변환 이해
스크립트 구성 요소를 사용하여 비동기 변환 만들기
동기 출력을 사용하여 사용자 지정 변환 구성 요소 개발