2016-05-04 3 views
0

Wie Verwenden der Variablenzuordnung bei Verwendung von Oracle OLE DB-Anbieter? Ich habe Folgendes getan:Wie Verwenden der Variablenzuordnung bei Verwendung von Oracle OLE DB-Anbieter in SSIS?

  1. SQL ausführen Aufgabe: Vollständige Ergebnismenge, um Ergebnisse der Abfrage zu halten.
  2. Foreach ADO-Enumerator: ADO-Objektquelle über Variable (Objektdatentyp).
  3. Variable Mapping: 1 Feld.
  4. Die Variable wird als Evaluieren als ein Express (True) konfiguriert
  5. Datenfluss: SQL-Befehl von Variable, wie SELECT spaltenname FROM tabelle wo columnName =?

Im Grunde, was ich versuche, die Ergebnisse einer Abfrage aus einer SQL Server-Tabelle zu tun ist, zu verwenden, (dh ..account Zahlen) und ziehen Sie Datensätze aus Oracle die Ergebnisse aus der SQL-Abfrage Referenz

+0

Das ist kein SQL-Befehl von Variable. SQL-Befehl von Variable ist, wenn Ihre gesamte SQL-Zeichenfolge in einer Variablen enthalten ist. –

Antwort

1

Es fühlt sich an, als ob du Gegenstände vermischst. Die Parametrisierung ? ist ein Platzhalter für eine Variable, die Sie in einer OLE DB-Quellkomponente auf die Schaltfläche Parameter und Map klicken.

Da Sie jedoch den SQL-Befehl aus einer Variablen verwenden, können Sie die Parameterisierungsoption nicht verwenden, wahrscheinlich weil das Risiko besteht, dass ein Benutzer die Form der Ergebnismenge über Expressions ändert hoch.

Also, einen Pick - entweder „SQL-Befehl“ mit dem richtigen parametetization oder „SQL-Befehl aus Variable“, wo Sie in Ihren Parametern in einem schrecklichen String Gebäude Art und Weise wie Dynamically assign value to variable in SSIS SQL Server 2005/2008/2008R2 Personen hinzufügen, beachten Sie, dass Sie sind auf 4k Zeichen in einer Zeichenfolgenvariablen beschränkt, die Ausdrücke verwendet.

Basierend auf dem Kommentar von "Grundsätzlich, was ich versuche zu tun ist, verwenden Sie die Ergebnisse einer Abfrage aus einer SQL Server-Tabelle (dh .. account Zahlen) und Datensätze aus Oracle-Verweis die Ergebnisse aus der SQL-Abfrage ziehen"

Es gibt zwei Möglichkeiten, dies zu umgehen. Mit dem, was Sie gerade entwickelt haben, steht meine obige Antwort immer noch. Sie vernichten die Kontonummern und verwenden diese als Filter in Ihrer Abfrage an Oracle. Dadurch wird für jede Kontonummer eine Abfrage an Oracle gesendet. Das kann oder darf nicht wünschenswert sein.

Der Vorteil dieses Ansatzes besteht darin, dass Sie mehrere Zeilen abrufen können. Unter der Annahme, dass Sie Informationen vom Typ "Kundenauftrag" abrufen, hat eine Kontonummer wahrscheinlich viele Kundenauftragszeilen.

Wenn Sie jedoch mit etwas arbeiten, das eine Null-zu-Eins-Zuordnung mit den Kontonummern hat, wie z. B. Daten auf Kontoebene, können Sie den von Ihnen gewählten Ansatz vereinfachen. Verschieben Sie Ihre SQL Server-Abfrage in eine OLE DB-Quellkomponente in Ihrem Datenfluss.

Dann, was Sie suchen, ist die Lookup-Komponente. Damit können Sie eine bestehende Datenzeile mit zusätzlichen Daten anreichern. Hier geben Sie eine Abfrage wie "SELECT AllTheColumnsICareAbout, AccountNumber FROM schema.Table" an. Anschließend ordnen Sie die Kontonummer der OLE DB-Quelle der in der Suchkomponente zu und klicken Sie auf das Häkchen neben allen Spalten, um die die vorhandene Zeile ergänzt werden soll.

+0

Danke Billinkc für Ihre schnelle Antwort. Im Grunde, was ich versuche zu tun ist, verwenden Sie die Ergebnisse einer Abfrage aus einer SQL Server-Tabelle, (dh .. account Zahlen) und Datensätze aus Oracle-Verweis die Ergebnisse aus der SQL-Abfrage –

+1

@DaveMaldonado aktualisiert, sehen, ob das Sinn macht. Sie können einen Blick durch meine Antworten werfen, die nach Verweisen auf die Lookup-Komponente suchen, und es sollte ein Paar geben, dem Sie folgen können. Beispiel: – billinkc

0

Ich glaube, was Sie fragen, ist, wie man SSIS verwendet, um Daten zu Oracle OleDb-Anbieter zu pushen.

Ich werde davon ausgehen, dass Oracle das Ziel ist.Die Idee, Datenziele mit variablen Spalten zu verwenden, wird nicht standardmäßig unterstützt. Sie sollten in der Lage sein, die SSIS API oder andere Mittel zu verwenden, ich nehme einen einfacheren Ansatz.

Ich habe vor kurzem ein Paket eingerichtet, um alle Tabellen aus einer Datenbank zu erhalten und dynamische CSV-Ausgabe zu erstellen. Eine Datei für jede Tabelle. Sie könnten etwas Ähnliches tun.

Schalten Sie den Streamwriter-Teil mit einem Abschnitt zu 1. Erstellen Sie die Tabelle im Ziel. 2. Fügen Sie Datensätze in Oracle ein. Ich bin mir nicht sicher, ob Sie einzelne Beilagen für Oracle benötigen. In einem anderen Projekt, das umgekehrt arbeitet, dynamisches csv in SQL. Wenn ich mit dem SQL-Server arbeite, lade ich eine Datentabelle und verwende die SQLBulkCopy-Klasse, um das Laden von Massen zu verwenden, was eine ausgezeichnete Leistung liefert.

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

Grundsätzlich versuche ich, die Ergebnisse einer Abfrage aus einer SQL Server-Tabelle zu verwenden. .account Zahlen) und ziehen Datensätze von Oracle verweisen die Ergebnisse aus der SQL-Abfrage. –

+0

Ahh Ich sehe, ich verstehe nicht, was du versuchst zu tun. Ich werde die Antwort von billinkc upvote. Ich denke, basierend auf Ihrem Feedback, dass er auf dem besten Weg ist. –

Verwandte Themen