Область действия временных таблиц ограничена только до тех пор, пока сеанс не будет активным.
В вашем случае, когда вы используете sp_executesql, локальная временная таблица выходит из области действия после завершения вызова sp_executesql.
Вам необходимо создать глобальные временные таблицы.
См. Ниже небольшой пример:
create table dbo.test_mytable( col1 int );
GO
insert into dbo.test_mytable
select 1 union
select 2;
go
create or alter procedure dbo.test_myproc( @mytable varchar(255), @mycol varchar(255) )
as
begin
declare @mysql varchar(4000);
drop table if exists ##mytemptable;
set @mysql = 'select ' + @mycol + ' from ' + @mytable;
set @mysql = 'select * into ##mytemptable from (' + @mysql + ') X';
exec (@mysql);
select * from ##mytemptable;
end;
GO
exec dbo.test_myproc 'dbo.test_mytable', 'col1';
Когда вы запустите приведенный выше фрагмент кода, вы увидите результат, как показано ниже:
col1
1
2