다음을 통해 공유


스크립트 구성 요소를 사용하여 원본 만들기

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

Integration Services 패키지의 데이터 흐름에서 원본 구성 요소를 사용하여 데이터 원본의 데이터를 로드하고 다운스트림 변환 및 대상에 전달할 수 있습니다. 일반적으로 기존 연결 관리자를 통해 데이터 원본에 연결합니다.

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

스크립트 구성 요소 및 이를 위해 생성하는 인프라 코드는 사용자 지정 데이터 흐름 구성 요소를 개발하는 프로세스를 크게 간소화합니다. 그러나 스크립트 구성 요소의 작동 방식을 이해하려면 사용자 지정 데이터 흐름 구성 요소 개발에 관련된 단계를 읽는 것이 유용할 수 있습니다. 사용자 지정 데이터 흐름 구성 요소 개발 섹션 , 특히 사용자 지정 원본 구성 요소 개발 항목을 참조하세요.

원본 구성 요소 시작

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

메타데이터 디자인 모드에서 원본 구성 요소 구성

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

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

스크립트 변환 편집기스크립트 페이지에서 ScriptLanguage 속성을 설정하여 스크립트 언어를 지정할 수도 있습니다.

참고 항목

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

연결 관리자 추가

일반적으로 원본 구성 요소는 기존 연결 관리자를 사용하여 데이터 흐름으로 로드할 데이터가 있는 데이터 원본에 연결합니다. 스크립트 변환 편집기연결 관리자 페이지에서 추가를 클릭하여 적절한 연결 관리자를 추가합니다.

그러나 연결 관리자는 특정 형식의 데이터 원본에 연결해야 하는 정보를 캡슐화하고 저장하는 편리한 단위일 뿐입니다. 데이터를 로드하거나 저장하기 위해 사용자 지정 코드를 작성해야 하며 데이터 원본에 대한 연결을 열고 닫을 수도 있습니다.

스크립트 구성 요소에서 연결 관리자를 사용하는 방법에 대한 일반적인 내용은 스크립트 구성 요소의 데이터 원본에 연결을 참조 하세요.

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

출력 및 출력 열 구성

원본 구성 요소에는 입력이 없으며 하나 이상의 출력을 지원합니다. 스크립트 변환 편집기입/출력 페이지에는 기본적으로 단일 출력이 만들어져 있지만 출력 열은 만들어져 있지 않습니다. 편집기의 이 페이지에서 다음 항목을 구성해야 하거나 구성할 수 있습니다.

  • 각 출력에 대해 수동으로 출력 열을 추가하고 구성해야 합니다. 각 출력에 대한 출력 열 폴더를 선택하고 열 추가열 제거 단추를 사용하여 원본 구성 요소의 각 출력에 대한 출력 열을 관리합니다. 나중에 자동 생성 코드에서 만든 형식화된 접근자 속성을 사용하여 여기에 할당한 이름으로 스크립트의 출력 열을 참조합니다.

  • 예기치 않은 값이 포함된 행에 대한 시뮬레이션된 오류 출력과 같은 추가 출력을 하나 이상 만들 수 있습니다. 출력 추가 및 출력 제거 단추를 사용하여 원본 구성 요소의 출력을 관리합니다. 각 행을 동일한 ExclusionGroup 값을 공유하는 출력 중 하나로만 전달하려는 출력의 ExclusionGroup 속성에 대해 0이 아닌 동일한 값을 지정하지 않는 한 모든 입력 행은 사용 가능한 모든 출력으로 전달됩니다. ExclusionGroup을 식별 하기 위해 선택한 특정 정수 값은 중요하지 않습니다.

    참고 항목

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

  • 출력에 친숙한 이름을 할당할 수 있습니다. 나중에 자동 생성 코드에서 만든 형식화된 접근자 속성을 사용하여 스크립트에서 해당 이름으로 출력을 참조합니다.

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

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

변수 추가

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

속성 필드에 여러 변수를 입력하는 경우 변수 이름을 쉼표로 구분합니다. ReadOnlyVariables 및 ReadWriteVariables 속성 필드 옆에 있는 줄임표(...) 단추를 클릭하고 변수 선택 대화 상자에서 변수를 선택하여 여러 변수를 입력할 수도 있습니다.

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

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

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

구성 요소에 대한 메타데이터를 구성한 후에는 Microsoft VSTA(Visual Studio Tools for Applications) IDE를 열어 사용자 지정 스크립트를 코딩합니다. VSTA를 열려면 스크립트 변환 편집기의 스크립트 페이지에서 스크립트 편집을 클릭합니다. ScriptLanguage 속성에서 선택한 스크립트 언어에 따라 Microsoft Visual Basic 또는 Microsoft Visual C# 중 하나를 사용하여 스크립트를 작성할 수 있습니다.

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

자동 생성된 코드 이해

원본 구성 요소를 만들고 구성한 후 VSTA IDE를 열면 편집 가능한 ScriptMain 클래스가 코드 편집기에서 나타납니다. 이 ScriptMain 클래스에서 사용자 지정 코드를 작성합니다.

ScriptMain 클래스에는 CreateNewOutputRows 메서드에 대한 스텁이 포함됩니다. CreateNewOutputRows는 원본 구성 요소에서 가장 중요한 방법입니다.

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

런타임에 데이터 흐름 엔진은 UserComponent 클래스에서 PrimeOutput 메서드를 호출합니다. 이 메서드는 부모 클래스의 메서드를 ScriptComponent 재정의합니다PrimeOutput. 그러면 PrimeOutput 메서드는 다음 메서드를 호출합니다.

  1. CreateNewOutputRows 메서드는 처음에 비어 있는 출력 버퍼에 데이터 원본의 행을 추가하도록 ScriptMain에서 재정의합니다.

  2. FinishOutputs 메서드는 기본적으로 비어 있습니다. 출력을 완료하는 데 필요한 처리를 수행하려면 ScriptMain에서 이 메서드를 재정의합니다.

  3. 부모 클래스의 ScriptBuffer 메서드를 호출 SetEndOfRowset 하여 출력이 완료되었음을 데이터 흐름 엔진에 나타내는 private MarkOutputsAsFinished 메서드입니다. 사용자 고유의 코드에서 SetEndOfRowset을 명시적으로 호출할 필요가 없습니다.

사용자 지정 코드 작성

사용자 지정 원본 구성 요소 만들기를 완료하려면 ScriptMain 클래스에서 사용할 수 있는 다음 메서드로 스크립트를 작성할 수 있습니다.

  1. AcquireConnections 메서드를 재정의하여 외부 데이터 원본에 연결합니다. 연결 관리자에서 연결 개체 또는 필요한 연결 정보를 추출합니다.

  2. 모든 원본 데이터를 동시에 로드할 수 있는 경우 PreExecute 메서드를 재정의하여 데이터를 로드합니다. 예를 들어 SQL Server 데이터베이스에 대한 ADO.NET 연결에 대해 SqlCommand를 실행하고 모든 원본 데이터를 동시에 SqlDataReader로 로드할 수 있습니다. 원본 데이터를 한 번에 한 행씩 로드해야 하는 경우(예: 텍스트 파일을 읽을 때) CreateNewOutputRows의 행을 반복할 때 데이터를 로드할 수 있습니다.

  3. 재정의된 CreateNewOutputRows 메서드를 사용하여 빈 출력 버퍼에 새 행을 추가하고 새 출력 행의 각 열 값을 채웁니다. 각 출력 버퍼의 AddRow 메서드를 사용하여 비어 있는 새 행을 추가한 다음 각 열의 값을 설정합니다. 일반적으로 외부 원본에서 로드된 열에서 값을 복사합니다.

  4. PostExecute 메서드를 재정의하여 데이터 처리를 완료합니다. 예를 들어 데이터를 로드하는 데 사용한 SqlDataReader 를 닫을 수 있습니다.

  5. 필요한 경우 외부 데이터 원본에서 연결을 끊도록 ReleaseConnections 메서드를 재정의합니다.

예제

다음 예제에서는 원본 구성 요소를 만드는 데 ScriptMain 클래스에 필요한 사용자 지정 코드를 보여 줍니다.

참고 항목

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

ADO.NET 원본 예

이 예에서는 기존 ADO.NET 연결 관리자를 사용하여 SQL Server 테이블의 데이터를 데이터 흐름으로 로드하는 원본 구성 요소를 보여 줍니다.

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

  1. SqlClient 공급자를 사용하여 AdventureWorks 데이터베이스에 연결하는 ADO.NET 연결 관리자를 만듭니다.

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

  3. 스크립트 변환 편집기를 엽니다. 입력 및 출력 페이지에서 기본 출력의 이름을 MyAddressOutput과 같은 보다 설명적인 이름으로 바꾸고 두 출력 열인 AddressIDCity를 추가하고 구성합니다.

    참고 항목

    City 출력 열의 데이터 형식을 DT_WSTR 변경해야 합니다.

  4. 연결 관리자 페이지에서 ADO.NET 연결 관리자를 추가하거나 만들고 해당 이름을 MyADONETConnection과 같은 이름으로 지정합니다.

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

  6. SQL Server 대상이나 스크립트 구성 요소를 사용하여 대상 만들기에서 보여 준 예제 대상 구성 요소와 같이 AddressIDCity 열을 필요로 하는 대상 구성 요소를 만들고 구성합니다. 그런 다음 원본 구성 요소를 대상에 연결합니다. (변환하지 않고 원본을 대상에 직접 연결할 수 있습니다.) AdventureWorks 데이터베이스에서 다음 Transact-SQL 명령을 실행하여 대상 테이블을 만들 수 있습니다.

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

    Imports System.Data.SqlClient  
    ...  
    Public Class ScriptMain  
        Inherits UserComponent  
    
        Dim connMgr As IDTSConnectionManager100  
        Dim sqlConn As SqlConnection  
        Dim sqlReader As SqlDataReader  
    
        Public Overrides Sub AcquireConnections(ByVal Transaction As Object)  
    
            connMgr = Me.Connections.MyADONETConnection  
            sqlConn = CType(connMgr.AcquireConnection(Nothing), SqlConnection)  
    
        End Sub  
    
        Public Overrides Sub PreExecute()  
    
            Dim cmd As New SqlCommand("SELECT AddressID, City, StateProvinceID FROM Person.Address", sqlConn)  
            sqlReader = cmd.ExecuteReader  
    
        End Sub  
    
        Public Overrides Sub CreateNewOutputRows()  
    
            Do While sqlReader.Read  
                With MyAddressOutputBuffer  
                    .AddRow()  
                    .AddressID = sqlReader.GetInt32(0)  
                    .City = sqlReader.GetString(1)  
                End With  
            Loop  
    
        End Sub  
    
        Public Overrides Sub PostExecute()  
    
            sqlReader.Close()  
    
        End Sub  
    
        Public Overrides Sub ReleaseConnections()  
    
            connMgr.ReleaseConnection(sqlConn)  
    
        End Sub  
    
    End Class  
    
    using System.Data.SqlClient;  
    public class ScriptMain:  
        UserComponent  
    
    {  
        IDTSConnectionManager100 connMgr;  
        SqlConnection sqlConn;  
        SqlDataReader sqlReader;  
    
        public override void AcquireConnections(object Transaction)  
        {  
            connMgr = this.Connections.MyADONETConnection;  
            sqlConn = (SqlConnection)connMgr.AcquireConnection(null);  
    
        }  
    
        public override void PreExecute()  
        {  
    
            SqlCommand cmd = new SqlCommand("SELECT AddressID, City, StateProvinceID FROM Person.Address", sqlConn);  
            sqlReader = cmd.ExecuteReader();  
    
        }  
    
        public override void CreateNewOutputRows()  
        {  
    
            while (sqlReader.Read())  
            {  
                {  
                    MyAddressOutputBuffer.AddRow();  
                    MyAddressOutputBuffer.AddressID = sqlReader.GetInt32(0);  
                    MyAddressOutputBuffer.City = sqlReader.GetString(1);  
                }  
            }  
    
        }  
    
        public override void PostExecute()  
        {  
    
            sqlReader.Close();  
    
        }  
    
        public override void ReleaseConnections()  
        {  
    
            connMgr.ReleaseConnection(sqlConn);  
    
        }  
    
    }  
    

플랫 파일 원본 예제

이 예제에서는 기존 플랫 파일 연결 관리자를 사용하여 플랫 파일의 데이터를 데이터 흐름으로 로드하는 원본 구성 요소를 보여 줍니다. 플랫 파일 원본 데이터는 SQL Server에서 데이터를 내보내는 방법으로 만듭니다.

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

  1. SQL Server 가져오기 및 내보내기 마법사를 사용하여 AdventureWorks 예제 데이터베이스의 Person.Address 테이블을 쉼표로 구분된 플랫 파일로 내보냅니다. 이 샘플에서는 파일 이름 ExportedAddresses.txt 사용합니다.

  2. 내보낸 데이터 파일에 연결하는 플랫 파일 연결 관리자를 만듭니다.

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

  4. 스크립트 변환 편집기를 엽니다. 입력 및 출력 페이지에서 MyAddressOutput과 같은 보다 설명적인 이름으로 기본 출력의 이름을 바꿉니다. 두 개의 출력 열인 AddressIDCity를 추가하고 구성합니다.

  5. 연결 관리자 페이지에서 MyFlatFileSrcConnectionManager와 같이 알기 쉬운 이름을 사용하여 플랫 파일 연결 관리자를 추가하거나 만듭니다.

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

  7. SQL Server 대상이나 스크립트 구성 요소를 사용하여 대상 만들기에서 보여 준 예제 대상 구성 요소와 같은 대상 구성 요소를 만들고 구성합니다. 그런 다음 원본 구성 요소를 대상에 연결합니다. (변환하지 않고 원본을 대상에 직접 연결할 수 있습니다.) AdventureWorks 데이터베이스에서 다음 Transact-SQL 명령을 실행하여 대상 테이블을 만들 수 있습니다.

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

    Imports System.IO  
    ...  
    Public Class ScriptMain  
        Inherits UserComponent  
    
        Private textReader As StreamReader  
        Private exportedAddressFile As String  
    
        Public Overrides Sub AcquireConnections(ByVal Transaction As Object)  
    
            Dim connMgr As IDTSConnectionManager100 = _  
                Me.Connections.MyFlatFileSrcConnectionManager  
            exportedAddressFile = _  
                CType(connMgr.AcquireConnection(Nothing), String)  
    
        End Sub  
    
        Public Overrides Sub PreExecute()  
            MyBase.PreExecute()  
            textReader = New StreamReader(exportedAddressFile)  
        End Sub  
    
        Public Overrides Sub CreateNewOutputRows()  
    
            Dim nextLine As String  
            Dim columns As String()  
    
            Dim delimiters As Char()  
            delimiters = ",".ToCharArray  
    
            nextLine = textReader.ReadLine  
            Do While nextLine IsNot Nothing  
                columns = nextLine.Split(delimiters)  
                With MyAddressOutputBuffer  
                    .AddRow()  
                    .AddressID = columns(0)  
                    .City = columns(3)  
                End With  
                nextLine = textReader.ReadLine  
            Loop  
    
        End Sub  
    
        Public Overrides Sub PostExecute()  
            MyBase.PostExecute()  
            textReader.Close()  
    
        End Sub  
    
    End Class  
    
    using System.IO;  
    public class ScriptMain:  
        UserComponent  
    
    {  
        private StreamReader textReader;  
        private string exportedAddressFile;  
    
        public override void AcquireConnections(object Transaction)  
        {  
    
            IDTSConnectionManager100 connMgr = this.Connections.MyFlatFileSrcConnectionManager;  
            exportedAddressFile = (string)connMgr.AcquireConnection(null);  
    
        }  
    
        public override void PreExecute()  
        {  
            base.PreExecute();  
            textReader = new StreamReader(exportedAddressFile);  
        }  
    
        public override void CreateNewOutputRows()  
        {  
    
            string nextLine;  
            string[] columns;  
    
            char[] delimiters;  
            delimiters = ",".ToCharArray();  
    
            nextLine = textReader.ReadLine();  
            while (nextLine != null)  
            {  
                columns = nextLine.Split(delimiters);  
                {  
                    MyAddressOutputBuffer.AddRow();  
                    MyAddressOutputBuffer.AddressID = columns[0];  
                    MyAddressOutputBuffer.City = columns[3];  
                }  
                nextLine = textReader.ReadLine();  
            }  
    
        }  
    
        public override void PostExecute()  
        {  
    
            base.PostExecute();  
            textReader.Close();  
    
        }  
    
    }  
    

참고 항목

스크립트 구성 요소를 사용하여 대상 만들기
사용자 지정 원본 구성 요소 개발