Использовать глобальную временную таблицу и динамические OPENROWSET
DROP TABLE ##Tmp;
GO
DECLARE @ProcName VARCHAR(100)='spGetOraganizationsList',
@ParamName VARCHAR(100), @DataType VARCHAR(20),
-- Mind to specify database and schema of the SP
@Query NVARCHAR(MAX)=' EXEC [mydb].[dbo].spGetOraganizationsList ';
SELECT PARAMETER_NAME,DATA_TYPE
INTO #Tmp
FROM information_schema.PARAMETERS
WHERE SPECIFIC_NAME=@ProcName;
-- Build SP exec
DECLARE ParamCursor CURSOR
FOR SELECT * FROM #Tmp
OPEN ParamCursor
FETCH NEXT FROM ParamCursor
INTO @ParamName,@DataType
WHILE @@FETCH_STATUS = 0
BEGIN
SET @Query=@Query+@ParamName+'=Null,'
FETCH NEXT FROM ParamCursor INTO @ParamName,@DataType
END
CLOSE ParamCursor
DEALLOCATE ParamCursor
SET @Query = left(@Query, len(@Query) - 1);
-- Build ad hoc distributed query which creates ##Tmp from SP exec.
SET @Query = 'SELECT * INTO ##Tmp FROM OPENROWSET(''SQLNCLI'', ''Server=localhost;Trusted_Connection=yes;'',''' + @Query + ''')';
EXEC (@Query);
-- Created by dynamic sql `##Tmp` is availabe in the current context.
SELECT *
FROM ##Tmp;
Не забудьте сначала включить специальные распределенные запросы.
sp_configure 'Show Advanced Options', 1
GO
RECONFIGURE
GO
sp_configure 'Ad Hoc Distributed Queries', 1
GO
RECONFIGURE
GO
РЕДАКТИРОВАТЬ
Мой ответ решает только одну проблему, сохраняя результат динамического вызова proc во временной таблице.И есть еще проблемы.
Во-первых, @p=null
просто не будет компилироваться, если тип @p
является определяемым пользователем типом таблицы.Вам нужен вид declare @t myType;
exec mySp ... ,@p=@t ...
.
Далее следует ошибка «не удается получить метаданные для sp, поскольку она содержит динамический запрос», которую вы прокомментировали.Похоже, вам нужно приложение, SqlClr или автономное приложение, которое сможет считывать и анализировать наборы данных, возвращаемые процессорами.
Наконец, если SP содержит условный sql, который может возвращать набор результатов различной схемы в зависимости от значений параметров, результат всех этих усилий все еще сомнителен.