2016-05-04 47 views
0

Oracle OLE DBプロバイダを使用しているときに変数マッピングを使用する方法は?私は以下を行った:SSISでOracle OLE DBプロバイダを使用しているときに変数マッピングを使用する方法は?

  1. 実行SQLタスク:クエリ結果を保持する完全な結果セット。
  2. Foreach ADO列挙子:変数(オブジェクトデータ型)より上のADOオブジェクトソース。
  3. 可変マッピング:1フィールド。
  4. 変数はExpressとして評価(True)として設定されます
  5. データフロー:変数からのSQLコマンドSELECT columnName FROM table where columnName =?

は基本的に私は何をしようとしていることは、SQLクエリの結果を参照して、SQL Serverテーブルからクエリの結果を使用する(すなわち..account番号)とOracleからレコードを引っ張っている

+0

これは、変数からのSQLコマンドではありません。変数からのSQLコマンドは、SQL文字列全体が変数に含まれている場合です。 –

答えて

1

それをあなたがアイテムを混ぜているように感じる。パラメータ化?は、OLE DBソースコンポーネントで[パラメータ]ボタンをクリックしてマップする変数のプレースホルダです。

しかし、変数からSQLコマンドを使用しているため、ユーザーが式を使用して結果セットの形を変更するリスクがあるため、パラメータ化オプションは使用できません高い。

適切なパラメータ化を含む「SQLコマンド」またはDynamically assign value to variable in SSIS SQL Server 2005/2008/2008R2のようなひどい文字列のファクタでパラメータを追加する「SQLコマンドからの変数」を選択します。 Expressionsを使用する文字列変数では4k文字に制限されています。

「基本的に私がやっているのは、SQL Serverテーブル(つまり、アカウント番号)からのクエリの結果を使用して、SQLクエリからの結果をOracleリファレンスレコードから取得することです」というコメントに基づいて、

これについては、2つの方法があります。あなたが現在開発しているもので、私の上記の答えはまだ立っています。口座番号を細断処理し、それらをOracleへの問合せのフィルタとして使用しています。これにより、所有しているアカウント番号ごとにOracleに問合せが発行されます。それは望ましくないかもしれません。

このアプローチの利点は、複数の行を取得できることです。 Sales Orderタイプの情報を引き出すと仮定すると、1つのアカウント番号には多くの受注行がある可能性があります。

ただし、アカウントレベルのデータなどのアカウント番号を使用してゼロから1へのマッピングを行っている場合は、取り組んでいるアプローチを簡素化できます。 SQL Serverクエリをデータフロー内のOLE DBソースコンポーネントに移動します。

次に、ルックアップコンポーネントを探しています。これにより、追加のデータで既存のデータ行を充実させることができます。ここでは、 "SELECT AllTheColumnsICareAbout、AccountNumber FROM schema.Table"のようなクエリを指定します。次に、AccountNumberをOLE DB SourceからLookup Component内のAccountNumberにマップし、既存の行を増やしたいすべての列の横にあるチェックマークをクリックします。

+0

お返事ありがとうございました。基本的に私がやろうとしているのは、SQL Serverテーブル(つまり、アカウント番号)からのクエリの結果を使用して、SQLクエリの結果をOracleリファレンスから取得することです。 –

+1

@DaveMaldonadoあなたはLookupコンポーネントへの参照を探して私の答えを一目で見ることができますし、例の後に続くことができるカップルでなければなりません – billinkc

0

私は、SSISを使用してOracle OleDbプロバイダにデータをプッシュする方法を尋ねています。

ここでは、Oracleを宛先とします。可変列のデータ宛先を使用するという考え方は、そのままではサポートされていません。あなたはSSIS APIまたは他の手段を使うことができるはずです。私はもっと簡単な方法を取っています。

最近、データベースからすべてのテーブルを取得し、動的なCSV出力を作成するパッケージをセットアップしました。各表に1つのファイル。あなたは何か似たようなことができます。

セクションを含むストリームライターパートを1に切り替えます。デスティネーションにテーブルを作成します。 2.レコードをOracleに挿入します。 Oracleへのシングル・インサートを行う必要があるかどうかはわかりません。逆に動作する別のプロジェクトでは、csvをSQLに変換します。私はSQLサーバーで作業するので、データテーブルをロードし、SQLBulkCopyクラスを使用して、優れたパフォーマンスを提供するバルクロードを使用します。

public void Main() 
    { 
     string datetime = DateTime.Now.ToString("yyyyMMddHHmmss"); 
     try 
     { 
      string TableName = Dts.Variables["User::CurrentTable"].Value.ToString(); 
      string FileDelimiter = ","; 
      string TextQualifier = "\""; 
      string FileExtension = ".csv"; 



      //USE ADO.NET Connection from SSIS Package to get data from table 
      SqlConnection myADONETConnection = new SqlConnection(); 
      myADONETConnection = (SqlConnection)(Dts.Connections["connection manager name"].AcquireConnection(Dts.Transaction) as SqlConnection); 



      //Read data from table or view to data table 
      string query = "Select * From [" + TableName + "]"; 
      SqlCommand cmd = new SqlCommand(query, myADONETConnection); 
      //myADONETConnection.Open(); 
      DataTable d_table = new DataTable(); 
      d_table.Load(cmd.ExecuteReader()); 
      //myADONETConnection.Close(); 



      string FileFullPath = Dts.Variables["$Project::ExcelToCsvFolder"].Value.ToString() + "\\Output\\" + TableName + FileExtension; 

      StreamWriter sw = null; 
      sw = new StreamWriter(FileFullPath, false); 

      // Write the Header Row to File 
      int ColumnCount = d_table.Columns.Count; 
      for (int ic = 0; ic < ColumnCount; ic++) 
      { 
       sw.Write(TextQualifier + d_table.Columns[ic] + TextQualifier); 
       if (ic < ColumnCount - 1) 
       { 
        sw.Write(FileDelimiter); 
       } 
      } 
      sw.Write(sw.NewLine); 

      // Write All Rows to the File 
      foreach (DataRow dr in d_table.Rows) 
      { 
       for (int ir = 0; ir < ColumnCount; ir++) 
       { 
        if (!Convert.IsDBNull(dr[ir])) 
        { 
         sw.Write(TextQualifier + dr[ir].ToString() + TextQualifier); 
        } 
        if (ir < ColumnCount - 1) 
        { 
         sw.Write(FileDelimiter); 
        } 
       } 
       sw.Write(sw.NewLine); 

      } 

      sw.Close(); 

      Dts.TaskResult = (int)ScriptResults.Success; 
     } 



     catch (Exception exception) 
     { 
      // Create Log File for Errors 
      //using (StreamWriter sw = File.CreateText(Dts.Variables["User::LogFolder"].Value.ToString() + "\\" + 
      // "ErrorLog_" + datetime + ".log")) 
      //{ 
      // sw.WriteLine(exception.ToString()); 
      //} 

      Dts.TaskResult = (int)ScriptResults.Failure; 
      throw; 
     } 


     Dts.TaskResult = (int)ScriptResults.Success; 
+0

基本的には、SQL Serverテーブル(すなわち、 .account numbers)を取得し、OracleからSQLクエリーの結果を参照するレコードをプルします。 –

+0

ああ私は、あなたがしようとしていることを理解していないことを知っています。私はbillinkcから答えをupvoteします。私はあなたのフィードバックに基づいて、彼が最高のコースにいると思っています。 –

関連する問題