2013-10-29 8 views
5

Ich habe eine gespeicherte Prozedur als den SQL-Befehlstext, der einen Parameter übergeben wird, der einen Tabellenname enthält. Der Prozess gibt dann Daten aus dieser Tabelle zurück. Ich kann die Tabelle nicht direkt als die OLE DB-Quelle aufrufen, da einige Geschäftslogik mit dem Ergebnis, das in dem Proc festgelegt wird, auftreten muss. In SQL 2008 funktionierte das gut. In einem aktualisierten 2012-Paket bekomme ich "Die Metadaten konnten nicht ermittelt werden, weil ... dynamisches SQL enthält. Erwägen Sie die Verwendung der WITH RESULT SETS-Klausel, um die Ergebnismenge explizit zu beschreiben."Verwenden von dynamischem SQL in einer OLE DB-Quelle in SSIS 2012

Das Problem ist, ich kann die Feldnamen im Proc nicht definieren, da der Tabellenname, der als Parameter übergeben wird, ein anderer Wert sein kann und die resultierenden Felder jedes Mal anders sein können. Hat jemand dieses Problem oder irgendwelche Ideen? Ich habe alle möglichen Dinge mit dynamischem SQL mit "dm_exec_describe_first_result_set", temporären Tabellen und CTEs versucht, die WITH RESULT SETS enthalten, aber es funktioniert nicht in SSIS 2012, der selbe Fehler. Kontext ist ein Problem mit vielen der dynamischen SQL-Ansätze.

Dies ist letzte, was ich versuchte, ohne Glück:

DECLARE @sql VARCHAR(MAX) 
SET @sql = 'SELECT * FROM ' + @dataTableName 

DECLARE @listStr VARCHAR(MAX) 
SELECT @listStr = COALESCE(@listStr +',','') + [name] + ' ' + system_type_name FROM sys.dm_exec_describe_first_result_set(@sql, NULL, 1) 

exec('exec(''SELECT * FROM myDataTable'') WITH RESULT SETS ((' + @listStr + '))') 
+0

Was passiert, wenn Sie 'SET FMTONLY OFF; EXEC MyProc' in Ihrer OLEDB-Quelle. Macht es das besser? – billinkc

+0

Versucht, aber es funktioniert nicht. SSIS benötigt die Metadaten. – jdf35

+0

Bumm. Hatte dieser Trick für einen Freund funktioniert, der sich mit temporären Tabellen beschäftigte, als sie von 2008 bis 2012 umgezogen sind. – billinkc

Antwort

4

Also ich aus Freundlichkeit bitten, von warum auf der grünen Erde Gottes sind Sie ein SSIS Datenflußtask mit dynamischen Quelldaten so zu handhaben ?

Der Grund, warum Sie in Schwierigkeiten laufen lassen, weil Sie jeden Zweck eines SSIS Datenflußtask sind pervertiert:

  • eine bekannte Quelle mit bekannten Metadaten zu extrahieren, die statisch typisiert und in Design zwischengespeichert werden können -Zeit
  • mit einfacher, durch ein bekanntes Verfahren ausgeführt werden (und idealerweise asynchron) Transformationen
  • die transformierten Daten zu nehmen und sie in eine bekannten Ziel-Last auch mit bekannten Metadaten

Es ist in Ordnung, Datenquellen zu parametrisieren, die unterschiedliche Daten zurückgeben. Aber es ist, offen gesagt, lächerlich, dass sie jedes Mal völlig unterschiedliche Metadaten ohne Übereinstimmung zwischen den verschiedenen Sets zurückbringen, und ich bin mir nicht ganz sicher, ob ich wissen möchte, wie Sie alle Spaltenmetadaten im Arbeitspaket von 2008 gehandhabt haben.

Deshalb möchten Sie, dass Sie der SSIS-Abfrage ein WITH RESULTS SET hinzufügen - damit einige Metadaten generiert werden können. Es tut dies zur Laufzeit nicht - es kann nicht! Es muss eine bekannte Menge von Spalten haben (weil es sie alle in kompilierte Variablen aliasiert), um damit zu arbeiten. Es erwartet dieselben Spalten jedes Mal, wenn es diese Datenflusstask ausführt - die exakt gleichen Spalten, bis auf die Namen, die Typen und die Einschränkungen.

Das führt zu einer (schrecklichen, schrecklichen) Lösung - kleben Sie einfach alle Daten in eine temporäre Tabelle mit Column1, Column2 ... ColumnN und verwenden Sie dann die gleiche Variable, die Sie als Tabellenname Parameter verwenden, um bedingte Verzweigung deinen Code und mach was du willst mit den Spalten.

Eine andere sinnvollere Lösung wäre, einen Datenflusstask für jede Quellentabelle zu erstellen und den Parameter in einer Rangfolgeneinschränkung zu verwenden, um einfach auszuwählen, welche Datenflussaufgabe ausgeführt werden soll.

Für eine Lösung, die für ein Out-of-the-Box-ETL schlecht geeignet ist, sollten Sie in Erwägung ziehen, nur Ihre eigenen in C# oder eine Skriptaufgabe statt der Datenflussaufgabe von SSIS zu rollen.

Kurz gesagt, bitte tun Sie das nicht. Denken Sie an die Kinder (Pakete)!

+0

Das ist in der Theorie in Ordnung, aber in der Praxis, wenn Sie 230 SSIS-Pakete haben, die auf 2012 mit Hunderten von alten DB-Quellen aufgerüstet werden müssen, die perfekt wie diese in 2008 eingerichtet sind, dann suchen Sie eine schnelle Lösung. – jdf35

1

Ich habe CosyRoc Dynamic DataFlow Plus verwendet, um dies zu erreichen.

Mithilfe von Konfigurationstabellen zum Erstellen der SQL Select-Anweisungen habe ich ein einzelnes SSIS-Paket, das Daten von Oracle und Sybase (oder einer beliebigen OLEDB-Quelle) in MS SQL lädt. Einige der Ergebnismengen befinden sich in Millionen von Zeilen und die Leistung ist ausgezeichnet.

Anstatt jedes Mal, wenn eine neue Tabelle benötigt wird, ein neues Paket zu schreiben, kann dieses in wenigen Minuten konfiguriert und auf einem bereits getesteten und robusten bestehenden Paket ausgeführt werden.

Ohne es wäre ich für Hunderte von Paketen geschrieben worden.

Verwandte Themen