3

私の職場の SQL Server 2008 セットアップでは、データ型が DateTime のとのDATE_RANGE_CONTROL2 つの列で呼び出されるデータベース テーブルをセットアップしました。当社の SSIS パッケージは、設定された日付範囲で Oracle データベースからデータを抽出するため、DB ソース エディターのほとんどの SQL コードは次の形式を取ります。startDateendDate

SELECT COLUMN1,COLUMN2,COLUMN3,TRANSACTION_DATE
FROM SOURCE_DATABASE_TABLE
WHERE TRANSACTION_DATE BETWEEN startDate AND endDate 

私がやりたいことは、実行時にクエリがテーブルから値を取得するようstartDateに動的に設定することです。オプションとして変数から SQL コマンドを使用することを検討しましたが、テーブルの値とテーブルから DB ソース SQL コマンドに値を供給する方法がわかりません。endDateDATE_RANGE_CONTROLstartDateendDateDATE_RANGE_CONTROL

ACTIVEX スクリプト タスクを使用して動的にデータ ポンプの SQLCommand プロパティを設定していた SQL SERVER 2000 DTS パッケージで同様のことを行いました。SSISでどのように行うのですか?

4

2 に答える 2

2

Google でかなりの時間を費やし、Microsoft SQL Server 2008 の SSIS ドキュメントに目を通した後、ようやく解読できました。自分をとても誇りに思っています。したがって、解決策は次のとおりです。

  1. SQL Server Business Intelligence Development Studio で、新しい SSIS パッケージを作成します。
  2. mine と という 3 つの変数を作成startDateendDateますstrDataSourceSQL。それらがすべてパッケージのスコープ レベルを持っていることを確認し、データ型がそれぞれInt32Int32およびString..
  3. Script Task[制御フロー] タブで、ツールボックスから [制御フロー] ペインに をドラッグします。それを右クリックし、ポップアップ メニューから [編集] を選択します。
  4. Scriptページで、 の右側にある省略記号をクリックしますReadWriteVariables。手順 1 で作成した変数、つまりuser::startDateuser::endtDateおよびにチェックマークを付けますuser::strDataSourceSQL。でスクリプト タスクの名前を変更できますGeneral page。それは良い習慣です。
  5. Scriptページで、ボタンをクリックして、事前Edit Script...に作成されたコードを含む Visual Studio IDE ペインを表示します。
  6. 次の変更を行います。ページの上部に、使用する名前空間とクラスをインポートするための数行があります。コード行を編集して、次の行があることを確認します。

    システムを使用する;
    System.Data の使用;
    Microsoft.SqlServer.Dts.Runtime を使用します。
    System.Data.OleDb を使用します。
    
  7. メニューの [プロジェクト] > [参照の追加] に移動します。[.NET] タブで、必ず選択してください。

    Microsoft.SqlServer.DTSPipelineWrap
    Microsoft.SqlServer.DTSRuntimeWrap
    ヒントはDotNetMonsterの功績によるものです。

  8. の中に

    public void Main()
    メソッドを実行すると、次のようなコメントが表示されます
    // TODO: ここにコードを追加します
    その行を置き換えるか、次のコード行を追加します。ところで、データ ソースとデータ送信先に OLEDB を使用しています。

  9. //変数を宣言する
    Microsoft.SqlServer.Dts.Runtime.Wrapper.IDTSConnectionManagerDatabaseParameters100 cmParams;
    System.Data.OleDb.OleDbConnection oleDbConn;
    
    
    ConnectionManager cm;
    Int32 strStartDate;
    Int32 strEndDate;
    String startDateSQL = "SELECT StartDate FROM DATE_RANGE_CONTROL";
    String endDateSQL   = "SELECT EndDate FROM DATE_RANGE_CONTROL";
    
    
    //Declare and assign Connection manager
    cm = Dts.Connections["YOUR_OLEDB_CONNECTION_MANAGER_NAME"];
    
    //Set Connection paramters
    cmParams = cm.InnerObject as Microsoft.SqlServer.Dts.Runtime.Wrapper.IDTSConnectionManagerDatabaseParameters100;
    
    //Instantiate the Oledb connection
    oleDbConn = cmParams.GetConnectionForSchema() as OleDbConnection;
    

    後で表示する関数の実行結果である変数strStartDateと変数を割り当てます。strEndDateOLEDB 接続に SQL コマンドを提供するだけです。

        strStartDate = (int)assignSQLCommand(startDateSQL,oleDbConn).ExecuteScalar();
        strEndDate = (int)assignSQLCommand(endDateSQL, oleDbConn).ExecuteScalar();

        // startDate 変数と endDate 変数に SQL 結果セットの値を割り当てます
        Dts.Variables["開始日"].Value = strStartDate;
        Dts.Variables["endDate"].Value = strEndDate;

文字列型の変数dataSourceSQLを宣言し、それに DataSource SQL コードを割り当てます。日付範囲の値を上記の変数の値に置き換えます。私にとって、コードは次のとおりです。

    String dataSourceSQL = "SELECT COLUMN1,COLUMN2,COLUMN3,TRANSACTION_DATE
    FROM SOURCE_DATABASE_TABLE
    WHERE TRANSACTION_DATE BETWEEN '"+Dts.Variables["startDate"].Value +"' AND '"+Dts.Variables["endDate"].Value+"'";

次に、の値をdataSourceSQLパッケージstrDataSourceSQL変数に割り当てます

    Dts.Variables["strDataSourceSQL"].Value = dataSourceSQL ;

メソッドの中かっこの外側に、public void Main()前に説明した次の関数を追加します。

    public OleDbCommand assignSQLCommand(String SqlCommand, OleDbConnection oledbconn)
    {
        新しい System.Data.OleDb.OleDbCommand(SqlCommand, oledbconn) を返します。
    }

メニューの [ビルド] > [ビルド [スクリプト名]] に移動します。保存してスクリプト ページを閉じます。最後に、データ ソース タスクを作成するだけです。タブに移動しData Flow、OLE DB DB ソースをペインにドラッグします。OLE DB ソースを右クリックし、[編集] を選択します。[接続マネージャー] ページで、OLE DB 接続マネージャーを選択し、Data access mode[ SQL command from variable. 変数名で を選択しますuser::strDataSourceSQL。スクリプト タスクをデータ フローの前に実行するように設定していれば、作業は完了です。

于 2013-05-28T14:55:12.010 に答える