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 + '))')
Was passiert, wenn Sie 'SET FMTONLY OFF; EXEC MyProc' in Ihrer OLEDB-Quelle. Macht es das besser? – billinkc
Versucht, aber es funktioniert nicht. SSIS benötigt die Metadaten. – jdf35
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