У меня есть сохраненный процесс в виде текста команды SQL, которому передается параметр, содержащий имя таблицы. Затем процедура возвращает данные из этой таблицы. Я не могу вызвать таблицу напрямую как источник OLE DB, потому что некоторая бизнес-логика должна произойти с набором результатов в процедуре. В SQL 2008 это работало нормально. В обновленном пакете 2012 года я получаю сообщение «Не удалось определить метаданные, поскольку... содержит динамический SQL. Рассмотрите возможность использования предложения WITH RESULT SETS для явного описания набора результатов».
Проблема в том, что я не могу определить имена полей в процедуре, потому что имя таблицы, которое передается в качестве параметра, может быть другим значением, и результирующие поля могут каждый раз быть разными. Кто-нибудь сталкивался с этой проблемой или есть идеи? Я пробовал всевозможные вещи с динамическим SQL, используя «dm_exec_describe_first_result_set», временные таблицы и CTE, которые содержат WITH RESULT SETS, но это не работает в SSIS 2012, та же ошибка. Контекст — это проблема многих подходов к динамическому SQL.
Это последнее, что я пробовал, но безуспешно:
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 + '))')
SET FMTONLY OFF; EXEC MyProc
в своем исходном коде OLEDB. Делает ли это лучше? - person billinkc   schedule 29.10.2013