스크립트 작업 및 ActiveX 스크립트 작업
필자가 SQL 2000 DTS를 사용하면서 자주 이용했던 작업 중 하나는 바로 ActiveX 스크립트 작업이었습니다. ActiveX 스크립트 작업은 사용자의 개발 범위를 SQL Server 쿼리에서 프로그래밍 영역까지 확장시킬 수 있는 기능입니다. 예를 들어 문자열을 구분 기호로 분리하는 split 함수를 생각해 봅시다. SQL에서는 기본적으로 split 함수가 제공되지 않기 때문에, 이러한 기능을 구현하기 위해서는 사용자 정의 함수(UDF)로 만들어 사용하든지, 다른 방법을 사용해야 합니다. 이 외에도 ADO나 OWC 등과 같은 시스템에 등록된 개체를 사용하여 작업을 한다든지, 동적으로 패키지의 속성을 변경하는 등과 같은 작업에 다양하게 이용할 수 있었습니다.
SQL 2005 SSIS에서는 스크립트 관련 작업 기능이 더욱 향상되었습니다. 우선 기본 스크립트 언어가 VBScript에서 VB.net 스크립트로 변경되었습니다. 이전 스크립트 작업은 VBScript나 JavaScript로 사용할 수 있었지만, SSIS에서는 VB.net 스크립트만 사용할 수 있습니다. 물론 이전 버전과의 호환성을 유지하기 위한 목적으로 ActiveX 스크립트 작업 개체가 있기 때문에 기존 버전의 VBScript나 JavaScript를 그대로 이용할 수는 있습니다.
또 다른 큰 변화로는 개발 환경이 향상된 점입니다. SQL 2000 DTS나 SQL 2005 SSIS의 ActiveX 스크립트 작업에서 스크립트 작성 창은 거의 메모장 수준으로 단순하였습니다. 하지만 SQL 2005 SSIS의 스크립트 작업에서는 VSA(Visual Studios for Application)를 제공하기 때문에 사용자는 다른 Microsoft 개발 도구에서 제공하는 것과 동일한 개발 환경을 사용할 수 있습니다.
스크립트 작업
스크립트 작업은 VB.net 스크립트를 이용하여 사용자가 원하는 작업을 수행하기 위한 작업 개체입니다. VSA(Visual Studios for Application) 개발 환경에서 작업에 필요한 스크립트를 작성할 수 있습니다. 스크립트 작업 내에서 외부의 변수를 사용하기 위해서는 속성 창에서 미리 사용할 변수를 지정해야 합니다.
Ÿ ScriptLanguage – 작성할 스크립트 언어를 설정합니다. Microsoft Visual Basic .NET 언어만 있습니다.
Ÿ PrecompileScriptIntoBinaryCode – 작성된 스크립트를 미리 컴파일 시킬지를 설정합니다. 스크립트를 미리 컴파일 하도록 설정을 하면 패키지가 실행되기 전에 스크립트가 컴파일 되어지기 때문에 실제 수행하는 시간은 빠를 수 있습니다. 하지만 미리 컴파일 하게 되면 컴파일 된 코드(Binary Code)가 패키지에 포함이 되기 때문에 패키지 파일의 크기는 약간 커질 수 있습니다.
만약, 이 속성 값을 변경하였다면 반드시 스크립트 디자인 창을 한 번 열었다 닫아줘야 설정한 속성대로 반영이 됩니다. 또한 64Bit 환경에서 패키지를 수행하는 경우에는 반드시 이 값이 True로 설정이 되어야 합니다.
Ÿ EntryPoint – 스크립트 내에서 시작할 클래스 위치를 설정합니다. 기본 위치는 ScriptMain 입니다.
Ÿ ReadOnlyVariables – 스크립트 내에서 패키지의 변수를 사용하는 경우에 이용됩니다. 예를 들어. 패키지에서 미리 만들어진 Var1 이라는 변수와 Var2 라는 변수를 스크립트 내에서 읽기 전용으로 이용하려면 다음과 같이 설정해 줘야 합니다.
사용자::Val1, 사용자::Val2 또는 간단히 Val1, Val2로 지정합니다.
Ÿ ReadWriteVariables – 스크립트 내에서 읽기 및 쓰기로 변수를 사용할 경우 지정합니다.
ActiveX 스크립트 작업
ActiveX 스크립트 작업은 이전 버전인 SQL 2000 DTS 패키지를 SQL 2005 SSIS로 업그레이드 시 호환성을 유지하기 위한 작업 개체입니다. 이 작업 역시 스크립트 작업과 마찬가지로 ADO(Active Data Object)나 ADSI(Active Directory Service Interface) 등과 같은 Object를 이용할 수 있으며 다양한 프로그래밍 기능을 사용할 수 있습니다. 이 기능은 다음 버전에서는 제거될 기능이기 때문에, 새롭게 작업을 만들 때에는 이 작업을 사용하지 말고 스크립트 작업을 이용하시기 바라며, 기존 DTS 패키지를 업그레이드 한 경우에는 VB.net 스크립트를 이용하는 작업으로 수정하시기 바랍니다.
Ÿ Language – 스크립트가 VB Script인지, Java Script인지를 설정합니다.
Ÿ Script – 작업 스크립트를 지정합니다.
Ÿ EntryMethod – 시작할 함수를 지정합니다.
ActiveX 스크립트 작업에서도 패키지 변수를 사용할 수 있습니다. 패키지 내에 변수 사용이나 간단한 스크립트 작업 사용 예제는 다음의 따라하기를 참고하시기 바랍니다.
따라하기 – 스크립트 작업에서 패키지 변수 사용하기
스크립트 작업 및 ActiveX 스크립트 작업에서 패키지에 지정된 사용자 변수를 사용하는 방법을 간단히 살펴보겠습니다.
1. 작업 창의 제어 흐름 영역의 빈 곳에서 마우스 오른쪽을 클릭하여 나타나는 메뉴 중, 변수(S)를 선택합니다.
(변수 사용에 대해서는 다음 번 강좌에서 자세히 다루도록 하겠습니다.)
2. 변수 창에서 가장 왼쪽에 있는 변수 추가 버튼을 사용하여 변수를 추가합니다.
변수 명 : val1 데이터 형식 : String 값 : 변수예제
변수 명 : val2 데이터 형식 : Int32 값 : 100
3. 왼쪽의 도구 상자에서 스크립트 작업을 선택한 후, 제어 흐름 영역에 추가합니다.
4. 스크립트 작업 편집기에서 ReadOnlyVariables 속성 값에 val1, val2를 추가한 후, 아래에 있는 스크립트 디자인(S)를 클릭하여 스크립트 편집기를 엽니다.
5. Main 함수 내에 다음 스크립트를 추가한 후, 편집기를 닫고 제어 흐름 영역에서 스크립트 작업을 실행합니다.
MsgBox(Dts.Variables("val1").Value)
MsgBox(Dts.Variables("val2").Value.ToString)
6. 왼쪽 도구상자에서 ActiveX 스크립트 작업을 선택하여 제어 흐름 영역에 추가합니다.
7. ActiveX 스크립트 작업 편집기에서 스크립트 속성 부분에 있는 ... 버튼을 클릭하여 스크립트 편집 창을 엽니다.
8. ActiveX 스크립트 창에 다음 코드를 추가한 후, 편집 창을 닫고 ActiveX 스크립트 작업을 실행합니다.
Msgbox DTSGlobalVariables("val1").value
Msgbox DTSGlobalVariables("val2").value
따라하기 – ADO를 이용하여 테이블의 데이터 읽어오기
스크립트 작업 및 ActiveX 스크립트 작업에서 ADO 개체를 이용하여 테이블에 있는 데이터를 읽어오는 간단한 예제를 만들어 보겠습니다. 스크립트 작업 추가 및 실행은 위의 따라하기와 동일하므로 스크립트 부분만을 설명 드리겠습니다.
1. 제어 흐름 영역에 ActiveX 스크립트 작업을 추가한 후, 더블 클릭하여 나타나는 편집기 창의 Script 부분에 다음과 같은 스크립트를 추가합니다.
'********************************************************************** ' Visual Basic ActiveX 스크립트 '************************************************************************ Function Dim adoConn, adoRs Set adoConn = CreateObject("ADODB.Connection") Set adoRs = CreateObject("ADODB.RecordSet") adoConn.ConnectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Initial Catalog=pubs;Data Source=localhost\ss2000" adoConn.Open adoRs.ActiveConnection = adoConn adoRs.Open "SELECT count(*) as Cnt FROM pubs.dbo.authors" msgbox "Total Record Cnt : " & adoRs("cnt").value, vbAlert, "메시지 출력 테스트 ActiveX" adoRs.Close Set adoRs = Nothing adoConn.Close Set adoConn = Nothing Main = DTSTaskExecResult_Success End Function |
2. 위 스크립트는 localhost\ss2000 인스턴스에 있는 pubs DB의 auhors 테이블 행 수를 읽어서 출력하는 단순한 예제입니다.
ADO를 이용한 스크립트 작성 시 참고하시기 바랍니다. 다음 단계는 위의 VBScript 를 VB.net 스크립트로 변형하여 스크립트 작업에서 이용하는 것입니다.
3. 제어 흐름 영역에 스크립트 작업을 추가한 후, 더블 클릭하여 나타나는 편집기 창에서 스크립트 디자인(S)를 클릭한 후, 다음 스크립트를 추가합니다.
Imports System Imports System.Data Imports System.Math Imports Microsoft.SqlServer.Dts.Runtime Imports System.Data.OleDb Public Class ScriptMain ' The execution engine calls this method when the task executes. ' To access the object model, use the Dts object. Connections, variables, events, ' and logging features are available as static members of the Dts class. ' Before returning from this method, set the value of Dts.TaskResult to indicate success or failure. ' ' To open Code and Text Editor Help, press F1. ' To open Object Browser, press Ctrl+Alt+J. Public Sub ' ' Add your code here Dim dataReader As OleDbDataReader Dim oleDBConn As OleDbConnection Dim oleDBCommand As OleDbCommand oleDBConn = New OleDbConnection("Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=pubs;Data Source=localhost\ss2000") oleDBCommand = New OleDbCommand("SELECT count(*) as Cnt FROM pubs.dbo.authors", oleDBConn) oleDBConn.Open() dataReader = oleDBCommand.ExecuteReader() dataReader.Read() MsgBox("Total Record Cnt : " & dataReader.GetInt32(0).ToString, MsgBoxStyle.OkOnly, "메시지출력테스트VB.net") dataReader.Close() oleDBConn.Close() End Sub End Class |
지금까지 SQL 2005 SSIS에 포함된 두 가지의 스크립트 작업에 대해 살펴 보았습니다. SQL 쿼리뿐만 아니라, 이 스크립트 작업들을 적절히 잘 사용한다면 패키지를 작성하고 수행하는 데 상당히 편리하게 이용할 수 있습니다.
'연구개발 > DTS & SSIS' 카테고리의 다른 글
기본 강좌 15 - XML 작업 (0) | 2009.06.20 |
---|---|
기본 강좌 14 - 패키지 실행작업 (0) | 2009.06.20 |
기본 강좌 12 - WMI 이벤트 감시자 작업 (0) | 2009.06.20 |
기본 강좌 11 - WMI 데이터 판독기 작업 (0) | 2009.06.20 |
기본 강좌 10 - 전송 작업 (0) | 2009.06.20 |