搜尋本站文章

2011-09-01

SSIS:使用「指令碼元件(Script Component)」來建立資料來源

使用環境:
SQL Server 2008
SQL Server 2008 R2


請參考以下的實作練習:

實作練習:使用「指令碼元件」來建立資料來源

範例說明:
需求:讀取「一般檔案來源」內的資料,執行相關轉換後匯出到「一般檔案目的地」。

工作流程如下:
(1) 使用「一般檔案連接管理員」來接到來源的文字檔案。
(2) 使用「指令碼元件」,設定為其資料來源。

(3) 設定與撰寫此「指令碼元件」內的指令碼程式。
(4) 執行相關轉換後匯出到「一般檔案目的地」。

準備工作:

步驟01. 將來源的文字檔案,放置到路徑:"C:\mySSIS\myProducts.txt"。


工作零:

步驟01. 新增加一個封裝程式。

步驟02. 在「控制流程」頁面,新增加一個「資料流程工作」。

步驟03. 點選「資料流程」頁面。


工作一:使用「一般檔案連接管理員」接到來源資料檔案

步驟01. 在「資料流程」頁面,在左下角的「連接管理員」區域。滑鼠右鍵,選擇「新增一般檔案連接」。

步驟02. 在「一般檔案連接管理員編輯器」視窗,點選「一般」頁面,輸入以下的參數:
在「連接管理員名稱」方塊,輸入:TXT_myProducts。
在「選取檔案並指定檔案屬性和檔案格式」區域,在「檔案名稱」方塊,輸入:C:\mySSIS\myProducts.txt。

其餘接受預設值,再點選「資料行」、「進階」、「預覽」等頁面。
點選「確定」。


工作二:使用「指令碼元件」,設定為資料來源

步驟01. 在左邊的「工具箱」,展開「資料流程轉換」區域,選取「指令碼元件」,拖曳到「資料流程」頁面。

步驟02. 在「選取指令碼元件類型」視窗,在「指令資料流程中如何使用指令碼」區域,點選「來源」。

--01_在「選取指令碼元件類型」視窗


點選「確定」。

步驟03. 在「指令碼轉換編輯器」視窗,在左邊窗格,點選「輸入及輸出」頁籤,輸入以下的參數:

在中間的「指定指令碼元件的資料行屬性」區域,在「輸入及輸出」區域。
在中間窗格,點選與展開「輸出 0」節點。

在右邊窗格,在「通用屬性」區域,在「Name」方塊,輸入:myProductsOutput。

在中間窗格,點選「輸出資料行」節點。在下方區域,點選「加入資料行」。
點選新增加的「資料行」,在右邊窗格,在「通用屬性」區域,在「Name」方塊,輸入:ProductID。

在「資料類型屬性」區域,在「DataType」方塊,設定為:四位元組帶正負號的整數 [DT_I4]。

在中間窗格,點選「輸出資料行」節點。在下方區域,點選「加入資料行」。
點選新增加的「資料行」,在右邊窗格,在「通用屬性」區域,在「Name」方塊,輸入:ProductName。

在「資料類型屬性」區域,在「DataType」方塊,設定為:字串 [DT_STR]。
在「Length」方塊,設定為:40。

--02 「輸入及輸出」頁籤,尚未設定


--03_設定ProductID


--04_設定ProductName


步驟04. 在左邊窗格,點選「連接管理員」頁籤,輸入以下的參數:
在右下角,點選「加入」。

在中間窗格,在「名稱」方塊,輸入:MyFlatFileSrcConnectionManager。
在中間窗格,在「連接管理員」方塊,下拉選取先前建立的一般檔案連接:TXT_myProducts。

--05_一般檔案連接:TXT_myProducts


步驟05. 在左邊窗格,點選「指令碼」頁籤,在「ScriptLanguage」方塊,選擇:Microsoft Visual Basic 2008。

在下方,點選「編輯指令碼」,輸入以下的指令碼:

...
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 myProductsOutputBuffer
                .AddRow()
                .ProductID = columns(0)
                .ProductName = columns(1)
            End With
            nextLine = textReader.ReadLine
        Loop

    End Sub

    Public Overrides Sub PostExecute()
        MyBase.PostExecute()
        textReader.Close()

    End Sub

End Class



步驟06. 在上方工具列選單,點選「檔案」\「結束」。

步驟07. 在「指令碼轉換編輯器」視窗,點選「確定」。


工作三:設定「一般檔案目的地」與執行封裝

步驟01. 在左邊的「工具箱」,展開「資料流程目的地」區域,選取「一般檔案目的地」,拖曳到「資料流程」頁面。

步驟02. 點選先前建立的「指令碼元件」,拖曳綠色的「資料流程路徑」到「一般檔案目的地」上。

步驟03. 點選此「一般檔案目的地」,設定以下的選項:
在「一般檔案目的地編輯器」視窗,在左邊窗格,點選「連接管理員」。點選「新增」。
在「一般檔案格式」視窗,點選「使用分隔符號」,點選「確定」。

在「一般檔案連接管理員編輯器」視窗,在「連接管理員名稱」方塊,輸入:TXT_Output_myProducts。
在「檔案名稱」方塊,輸入:C:\mySSIS\TXT_Output_myProducts.txt。

分別點選「資料行」、「進階」、「預覽」等頁籤。
點選「確定」。

步驟04. 點選「對應」頁籤,點選「確定」。

--06_「一般檔案目的地」_對應


步驟05. 執行偵錯此封裝。

--07 檢視所設計的封裝


--08_檢視匯出的文字檔案



參考資料:

使用指令碼擴充封裝
http://msdn.microsoft.com/zh-tw/library/ms345171.aspx

連接至指令碼工作中的資料來源
http://msdn.microsoft.com/zh-tw/library/ms136018.aspx

開發特定類型的指令碼元件
http://msdn.microsoft.com/zh-tw/library/ms345170.aspx

以指令碼元件建立來源
http://msdn.microsoft.com/zh-tw/library/ms136060.aspx

使用指令碼元件建立同步轉換
http://msdn.microsoft.com/zh-tw/library/ms136114.aspx

使用指令碼元件建立非同步轉換
http://msdn.microsoft.com/zh-tw/library/ms136133.aspx