SSIS の [スクリプトコンポーネント] は「変換元」,「変換」,「変換先」のどれにでもなることができる高度にカスタマイズ可能なコンポーネントです。
前回は,カスタム変換元を作成して,特殊な CSV に対応してみました。
http://blogs.timberlandchapel.com/blogs/timberlandchapel/articles/1068.aspx
今回は,カスタム変換を利用して,入力列に特殊な変換を行う例を紹介します。
文字列型の入力列の一つに混じっている特定の文字を空白に置き換えてパイプする処理を構築します。
ソースはデータベース上のテーブルに,変換先はフラットファイルにしてみます。
この記事は,
SQL Server 2005 Developer Edition Service Pack 1
Integration Services に基づいて記述しています。
まずは,データフローの基本を作成します。
1 [OLE DB ソース] を一つ,[スクリプト変換] を一つ,[フラットファイル 変換先] を一つ用意したデータフロータスクを用意します
2 [OLE DB ソース] はデータベース上のテーブルに接続し,[フラットファイル 変換先] は CSV ファイルとして作成します
[フラットファイル 変換先] は,データのパイプが出来上がったあと,最後に作成してもよいです。
スクリプト変換のプロパティを調整します。
1 [入力列] タブにはテーブルからパイプされる列が表示されます。特に調整の必要はありません。
2 [入力および出力] タブで,新しい出力の設定をします
スクリプトによって変換した新しい列を出力列に含めるため,列を一つ追加します。
[SynchronouseInputID] に入力列の ID を設定しておけば,入力列のすべては自動的に出力にリダイレクトされます。
3 [スクリプト] タブではスクリプトの動作に関する設定をしますが,今回のシナリオでは特に調整の必要はありません。
あとは,[スクリプトのデザイン] をクリックして,VB.NET のコードを書くだけです。
今回のコードでは,入力列の [BusinessClassName] 列(DT_WSTR)内の文字列にある「カタカナのアからソまでの文字」を空白に置き換えて,新しい列である [FilteredClassName] にパイプします。
フィルタする文字の評価はとても簡易な処理でおこなっているので,実用にはもっと複雑な処理を記述する必要があるでしょう。
Public Overrides Sub Input_ProcessInputRow(ByVal Row As InputBuffer)
' Edit
Dim inputChars As Char() = Row.BusinessClassName.ToCharArray
For index As Int32 = 0 To inputChars.Length - 1
Dim currentChar As Char = inputChars(index)
If currentChar >= "ア"c AndAlso currentChar <= "ソ"c Then
inputChars(index) = " "c
End If
Next
Row.FilteredClassName = New String(inputChars)
End Sub
入力列から受け取った値を操作して,特定の列にセットするためのコードはこれだけです。
自動生成するスクリプト内の [<入力名>_ProcessInputRow] プロシージャに,データの操作方法を記述するだけです。
ここでは,引数で受け取る [Row] オブジェクトを使用して,[Row.BusinessClassName] から値を受け取って,変換後の値を [FilteredClassName] にセットしています。
これで,カスタマイズした変換を行う基礎的なデータフロータスクが完成します。