スクリプト コンポーネントによる変換先の作成

Integration Services パッケージのデータ フロー内では、変換先コンポーネントを使用して、上流の変換元や変換から受け取ったデータをデータ ソースに保存します。通常、変換先コンポーネントをデータ ソースに接続するには、既存の接続マネージャを使用します。

スクリプト コンポーネントの概要については、「スクリプト コンポーネントによるデータ フローの拡張」を参照してください。

スクリプト コンポーネントおよびそれによって生成されるインフラストラクチャ コードを活用すれば、カスタム データ フロー コンポーネントを開発するための手順を大幅に簡略化できます。ただし、スクリプト コンポーネントの動作のしくみを理解するため、「カスタム データ フロー コンポーネントの開発」のセクション、特に「カスタム変換先コンポーネントの開発」を参照して、カスタム データ フロー コンポーネントの開発手順に目を通しておくと役に立ちます。

変換先コンポーネントの概要

SSIS デザイナの [データ フロー] タブにスクリプト コンポーネントを追加すると、[スクリプト コンポーネントの種類を選択] ダイアログ ボックスが開き、[変換元][変換先]、または [変換] スクリプトのいずれかを選択するように求められます。このダイアログ ボックスで、[変換先] を選択します。

次に、SSIS デザイナで、変換の出力を変換先コンポーネントに接続します。テスト目的の場合、変換を介さずに変換元を直接変換先に接続することもできます。

メタデータ デザイン モードでの変換先コンポーネントの構成

変換先コンポーネントを作成するオプションを選択したら、[スクリプト変換エディタ] を使用して、コンポーネントを構成します。詳細については、「スクリプト コンポーネント エディタでのスクリプト コンポーネントの構成」を参照してください。

スクリプト変換先で使用するスクリプト言語を選択するには、[スクリプト変換エディタ] ダイアログ ボックスの [スクリプト] ページにある [ScriptLanguage] プロパティを設定します。

注意注意

スクリプト コンポーネントの既定のスクリプト言語を設定するには、[オプション] ダイアログ ボックスの [全般] ページにある [スクリプト言語] オプションを使用します。詳細については、「[全般] ページ」を参照してください。

データ フローの変換先コンポーネントには、1 つの入力があり、出力はありません。コンポーネントの入力の設定は、メタデータ デザイン モードでカスタム スクリプトを記述する前に完了する必要のある作業の 1 つです。これを行うには、[スクリプト変換エディタ] を使用します。

接続マネージャの追加

通常、変換先コンポーネントは既存の接続マネージャを使用してデータ ソースに接続し、データ フローからのデータを保存します。[スクリプト変換エディタ][接続マネージャ] ページで [追加] をクリックして、適切な接続マネージャを追加します。

ただし、接続マネージャは、便宜上、特定の種類のデータ ソースに接続するために必要な情報をカプセル化して格納するユニットにすぎません。データの読み込みや保存、場合によってはデータ ソースとの接続や切断を行うためには、独自のカスタム コードを記述する必要があります。

スクリプト コンポーネントでの接続マネージャの使用方法に関する一般情報については、「スクリプト コンポーネントでのデータ ソースへの接続」を参照してください。

[スクリプト変換エディタ][接続マネージャ] ページの詳細については、「[スクリプト変換エディタ] ([接続マネージャ] ページ)」を参照してください。

入力および入力列の設定

変換先コンポーネントには、1 つの入力があり、出力はありません。

[スクリプト変換エディタ][入力列] ページには、データ フローの上流に位置するコンポーネントの出力で使用可能な列が一覧表示されます。保存する列を選択します。

[スクリプト変換エディタ][入力列] ページの詳細については、「[スクリプト変換エディタ] ([入力列] ページ)」を参照してください。

[スクリプト変換エディタ][入力および出力] ページには入力が 1 つ表示されています。この入力の名前は変更できます。スクリプト内ではこの名前で入力を参照しますが、参照には自動生成されたコードによって作成されたアクセサ プロパティが使用されます。

[スクリプト変換エディタ][入力および出力] ページの詳細については、「[スクリプト変換エディタ] ([入力および出力] ページ)」を参照してください。

変数の追加

既存の変数の値をスクリプト内で使用する場合、[スクリプト変換エディタ][スクリプト] ページで、ReadOnlyVariables プロパティおよび ReadWriteVariables プロパティのフィールドに追加できます。

プロパティ フィールドに複数の変数を追加する場合は、各変数名をコンマで区切ります。また、ReadOnlyVariables プロパティ フィールドや ReadWriteVariables プロパティ フィールドの横にある参照ボタン ([...]) をクリックして [変数の選択] ダイアログ ボックスを開き、複数の変数を選択することもできます。

スクリプト コンポーネントで変数を使用する方法に関する一般情報については、「スクリプト コンポーネントでの変数の使用」を参照してください。

[スクリプト変換エディタ][スクリプト] ページの詳細については、「[スクリプト変換エディタ] ([スクリプト] ページ)」を参照してください。

コード デザイン モードでの変換先コンポーネントのスクリプト作成

コンポーネントのメタデータを構成した後、カスタム スクリプトを記述できます。[スクリプト変換エディタ][スクリプト] ページで [スクリプトの編集] をクリックし、MicrosoftVisual Studio Tools for Applications (VSTA) IDE を開いて、カスタム スクリプトを追加できます。使用するスクリプト言語は、[スクリプト] ページの [ScriptLanguage] プロパティで、MicrosoftVisual Basic 2008 と MicrosoftVisual C# 2008 のどちらをスクリプト言語として選択したかによって決まります。

スクリプト コンポーネントを使用して作成するすべての種類のコンポーネントに関する重要情報については、「スクリプト コンポーネントのコーディングおよびデバッグ」を参照してください。

自動生成されたコードについて

変換先コンポーネントを作成、構成した後で VSTA IDE を開くと、コード エディタには ScriptMain クラスが編集可能な状態で表示されます。また、ProcessInputRow メソッドがスタブとして表示されます。カスタム コードは ScriptMain クラスに記述します。また、ProcessInputRow は変換先コンポーネントの最重要メソッドです。

VSTA の [プロジェクト エクスプローラ] ウィンドウを開くと、スクリプト コンポーネントにより、BufferWrapper および ComponentWrapper というプロジェクト アイテムが、読み取り専用の状態で自動生成されていることもわかります。ScriptMain クラスは、ComponentWrapper プロジェクト アイテム内の UserComponent クラスを継承します。

実行時には、データ フロー エンジンが UserComponent クラスの ProcessInput メソッドを呼び出します。これは親クラスである ScriptComponentProcessInput メソッドをオーバーライドします。ProcessInput メソッドは、入力バッファに格納された行を順にループし、各行で 1 回ずつ ProcessInputRow メソッドを呼び出します。

カスタム コードの記述

カスタム変換先コンポーネントの作成を終了するには、必要に応じて ScriptMain クラスで使用できる次のメソッドにスクリプトを記述する場合があります。

  1. 外部データ ソースに接続する場合は、AcquireConnections メソッドをオーバーライドします。接続マネージャから、接続オブジェクトまたは必要な接続情報を抽出します。

  2. データを保存する準備のため、PreExecute メソッドをオーバーライドします。たとえば、このメソッド内で SqlCommand およびそのパラメータを作成し、設定することができます。

  3. 各入力行を外部データ ソースにコピーするには、オーバーライドされた ProcessInputRow メソッドを使用します。たとえば、SQL Server 変換先の場合、列の値を SqlCommand のパラメータにコピーし、各行で 1 回ずつコマンドを実行できます。フラット ファイル変換先の場合、各列の値を列区切り記号で区切って StreamWriter に書き込むことができます。

  4. 必要に応じて外部データ ソースとの接続を切断し、その他の必要なクリーンアップ作業を実行するには、PostExecute メソッドをオーバーライドします。

次の例では、変換先コンポーネントを作成するために ScriptMain クラスで必要なコードを示します。

注意注意

これらの例では、サンプル データベース AdventureWorksPerson.Address テーブルを使用して、その第 1 列および第 4 列、つまり int 型の AddressID および nvarchar(30) 型の City の各列を、データ フローにそのまま渡します。このセクションの変換元、変換、および変換先の例でも、同じデータが使用されます。他の前提条件および仮定条件については、それぞれの例で説明します。

ADO.NET 変換先の例

この例では、既存の ADO.NET 接続マネージャを使用して、データ フローのデータを SQL Server テーブルに保存する変換先コンポーネントを示します。

このサンプル コードを実行する場合は、パッケージやコンポーネントを次のように設定する必要があります。

  1. SqlClient プロバイダを使用する ADO.NET 接続マネージャを作成して、AdventureWorks データベースに接続します。

  2. AdventureWorks データベースで次の Transact-SQL コマンドを実行して、変換先テーブルを作成します。

    CREATE TABLE [Person].[Address2](
        [AddressID] [int] NOT NULL,
        [City] [nvarchar](30) NOT NULL
    )
    
  3. 新しいスクリプト コンポーネントを [データ フロー] デザイナ画面に追加し、変換先として構成します。

  4. SSIS デザイナで、上流変換元の出力または変換の出力を変換先コンポーネントに接続します (変換を介さずに変換元を直接変換先に接続することもできます)。この出力には、サンプル データベース AdventureWorksPerson.Address テーブルから、少なくとも AddressID 列および City 列を含むデータが渡される必要があります。

  5. [スクリプト変換エディタ] を開きます。[入力列] ページで、AddressID 入力列と City 入力列を選択します。

  6. [入力および出力] ページで、入力を MyAddressInput などのわかりやすい名前に変更します。

  7. [接続マネージャ] ページで、ADO.NET 接続マネージャを追加または作成し、MyADONETConnectionManager などの名前を付けます。

  8. [スクリプト] ページで、[スクリプトの編集] をクリックし、続きのスクリプトを入力します。スクリプト開発環境を閉じます。

  9. [スクリプト変換エディタ] を閉じ、サンプルを実行します。

Imports System.Data.SqlClient
...
Public Class ScriptMain
    Inherits UserComponent

    Dim connMgr As IDTSConnectionManager100
    Dim sqlConn As SqlConnection
    Dim sqlCmd As SqlCommand
    Dim sqlParam As SqlParameter

    Public Overrides Sub AcquireConnections(ByVal Transaction As Object)

        connMgr = Me.Connections.MyADONETConnectionManager
        sqlConn = CType(connMgr.AcquireConnection(Nothing), SqlConnection)

    End Sub

    Public Overrides Sub PreExecute()

        sqlCmd = New SqlCommand("INSERT INTO Person.Address2(AddressID, City) " & _
            "VALUES(@addressid, @city)", sqlConn)
        sqlParam = New SqlParameter("@addressid", SqlDbType.Int)
        sqlCmd.Parameters.Add(sqlParam)
        sqlParam = New SqlParameter("@city", SqlDbType.NVarChar, 30)
        sqlCmd.Parameters.Add(sqlParam)

    End Sub

    Public Overrides Sub MyAddressInput_ProcessInputRow(ByVal Row As MyAddressInputBuffer)
        With sqlCmd
            .Parameters("@addressid").Value = Row.AddressID
            .Parameters("@city").Value = Row.City
            .ExecuteNonQuery()
        End With
    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;
    SqlCommand sqlCmd;
    SqlParameter sqlParam;

    public override void AcquireConnections(object Transaction)
    {

        connMgr = this.Connections.MyADONETConnectionManager;
        sqlConn = (SqlConnection)connMgr.AcquireConnection(null);

    }

    public override void PreExecute()
    {

        sqlCmd = new SqlCommand("INSERT INTO Person.Address2(AddressID, City) " +
            "VALUES(@addressid, @city)", sqlConn);
        sqlParam = new SqlParameter("@addressid", SqlDbType.Int);
        sqlCmd.Parameters.Add(sqlParam);
        sqlParam = new SqlParameter("@city", SqlDbType.NVarChar, 30);
        sqlCmd.Parameters.Add(sqlParam);

    }

    public override void MyAddressInput_ProcessInputRow(MyAddressInputBuffer Row)
    {
        {
            sqlCmd.Parameters["@addressid"].Value = Row.AddressID;
            sqlCmd.Parameters["@city"].Value = Row.City;
            sqlCmd.ExecuteNonQuery();
        }
    }

    public override void ReleaseConnections()
    {

        connMgr.ReleaseConnection(sqlConn);

    }

}

フラット ファイル変換先の例

この例では、既存のフラット ファイル接続マネージャを使用して、データ フローのデータをフラット ファイルに保存する変換先コンポーネントを示します。

このサンプル コードを実行する場合は、パッケージやコンポーネントを次のように設定する必要があります。

  1. 変換先ファイルに接続するフラット ファイル接続マネージャを作成します。ファイルが存在しない場合は、変換先コンポーネントによって作成されます。変換先ファイルを、AddressID 列および City 列を含む、コンマ区切りファイルとして構成します。

  2. 新しいスクリプト コンポーネントを [データ フロー] デザイナ画面に追加し、変換先として構成します。

  3. SSIS デザイナで、上流変換元の出力または変換の出力を変換先コンポーネントに接続します (変換を介さずに変換元を直接変換先に接続することもできます)。この出力には、サンプル データベース AdventureWorks サンプル データベースの Person.Address テーブルから、少なくとも AddressID 列および City 列を含むデータが渡される必要があります。

  4. [スクリプト変換エディタ] を開きます。[入力列] ページで、AddressID 列と City 列を選択します。

  5. [入力および出力] ページで、入力を MyAddressInput などのわかりやすい名前に変更します。

  6. [接続マネージャ] ページで、フラット ファイル接続マネージャを追加または作成し、MyFlatFileDestConnectionManager などのわかりやすい名前を付けます。

  7. [スクリプト] ページで、[スクリプトの編集] をクリックし、続きのスクリプトを入力します。スクリプト開発環境を閉じます。

  8. [スクリプト変換エディタ] を閉じ、サンプルを実行します。

Imports System.IO
...
Public Class ScriptMain
    Inherits UserComponent

    Dim copiedAddressFile As String
    Private textWriter As StreamWriter
    Private columnDelimiter As String = ","

    Public Overrides Sub AcquireConnections(ByVal Transaction As Object)

        Dim connMgr As IDTSConnectionManager100 = _
            Me.Connections.MyFlatFileDestConnectionManager
        copiedAddressFile = CType(connMgr.AcquireConnection(Nothing), String)

    End Sub

    Public Overrides Sub PreExecute()

        textWriter = New StreamWriter(copiedAddressFile, False)

    End Sub

    Public Overrides Sub MyAddressInput_ProcessInputRow(ByVal Row As MyAddressInputBuffer)

        With textWriter
            If Not Row.AddressID_IsNull Then
                .Write(Row.AddressID)
            End If
            .Write(columnDelimiter)
            If Not Row.City_IsNull Then
                .Write(Row.City)
            End If
            .WriteLine()
        End With

    End Sub

    Public Overrides Sub PostExecute()

        textWriter.Close()

    End Sub

End Class
using System.IO;
public class ScriptMain:
    UserComponent

{
    string copiedAddressFile;
    private StreamWriter textWriter;
    private string columnDelimiter = ",";

    public override void AcquireConnections(object Transaction)
    {

        IDTSConnectionManager100 connMgr = this.Connections.MyFlatFileDestConnectionManager;
        copiedAddressFile = (string) connMgr.AcquireConnection(null);

    }

    public override void PreExecute()
    {

        textWriter = new StreamWriter(copiedAddressFile, false);

    }

    public override void MyAddressInput_ProcessInputRow(MyAddressInputBuffer Row)
    {

        {
            if (!Row.AddressID_IsNull)
            {
                textWriter.Write(Row.AddressID);
            }
            textWriter.Write(columnDelimiter);
            if (!Row.City_IsNull)
            {
                textWriter.Write(Row.City);
            }
            textWriter.WriteLine();
        }

    }

    public override void PostExecute()
    {

        textWriter.Close();

    }

}
Integration Services のアイコン (小) 最新の Integration Services の入手

マイクロソフトが提供する最新のダウンロード、アーティクル、サンプル、ビデオ、およびコミュニティで選択されたソリューションについては、MSDN または TechNet の Integration Services のページを参照してください。

これらの更新が自動で通知されるようにするには、ページの RSS フィードを購読します。