В вызывающей стороне может быть создана временная таблица, а затем заполнена из вызываемого SP.
create table #GetValuesOutputTable(
...
);
exec GetValues; -- populates #GetValuesOutputTable
select * from #GetValuesOutputTable;
Некоторые преимущества этого подхода перед «insert exec» состоят в том, что он может быть вложенным и может использоваться как вход или выход.
Некоторые недостатки заключаются в том, что «аргумент» не является публичным, создание таблицы существует внутри каждого вызывающего, и что имя таблицы может конфликтовать с другими временными объектами. Помогает, когда имя временной таблицы близко соответствует имени SP и соответствует некоторому соглашению.
Если взять немного дальше, то для вывода только временных таблиц вызываемый SP может одновременно поддерживать подход insert-exec и подход временных таблиц. Это не слишком помогает для цепочки SP, потому что таблицу все еще нужно определить в вызывающей стороне, но может помочь упростить тестирование из строки cmd или при внешнем вызове.
-- The "called" SP
declare
@returnAsSelect bit = 0;
if object_id('tempdb..#GetValuesOutputTable') is null
begin
set @returnAsSelect = 1;
create table #GetValuesOutputTable(
...
);
end
-- populate the table
if @returnAsSelect = 1
select * from #GetValuesOutputTable;