Для любого, кто имеет SQL 2012 или более позднюю версию, я смог выполнить это с помощью хранимых процедур, которые не являются динамическими и каждый раз выдают одинаковые столбцы.
Общая идея заключается в том, что я создаю динамический запрос для создания, вставки, выбора и удаления временной таблицы и выполняю ее после того, как она все сгенерирована. Я динамически генерирую временную таблицу, сначала извлекая имена и типы столбцов из хранимой процедуры .
Примечание: есть гораздо лучшие, более универсальные решения, которые будут работать с меньшим количеством строк кода, если вы захотите / сможете обновить SP или изменить конфигурацию и использовать OPENROWSET
. Используйте ниже, если у вас нет другого пути.
DECLARE @spName VARCHAR(MAX) = 'MyStoredProc'
DECLARE @tempTableName VARCHAR(MAX) = '#tempTable'
-- might need to update this if your param value is a string and you need to escape quotes
DECLARE @insertCommand VARCHAR(MAX) = 'INSERT INTO ' + @tempTableName + ' EXEC MyStoredProc @param=value'
DECLARE @createTableCommand VARCHAR(MAX)
-- update this to select the columns you want
DECLARE @selectCommand VARCHAR(MAX) = 'SELECT col1, col2 FROM ' + @tempTableName
DECLARE @dropCommand VARCHAR(MAX) = 'DROP TABLE ' + @tempTableName
-- Generate command to create temp table
SELECT @createTableCommand = 'CREATE TABLE ' + @tempTableName + ' (' +
STUFF
(
(
SELECT ', ' + CONCAT('[', name, ']', ' ', system_type_name)
FROM sys.dm_exec_describe_first_result_set_for_object
(
OBJECT_ID(@spName),
NULL
)
FOR XML PATH('')
)
,1
,1
,''
) + ')'
EXEC( @createTableCommand + ' '+ @insertCommand + ' ' + @selectCommand + ' ' + @dropCommand)