Следующий код выполняется успешно, если я не добавлю create procedure dbo.proc_name ... as
к нему:
use db_name
go
declare @sp_date date;
select @sp_date = getdate();
if object_id('tempdb..##global_tmp_tbl') is not null drop table ##global_tmp_tbl;
begin transaction
set xact_abort on
declare @query varchar(250), @exec_stmnt varchar(500);
set @query = 'exec remote_db.dbo.remote_sp' + ' ''''' + cast(@sp_date as varchar(10)) + ''''' ';
set @query = '''' + @query + '''';
set @exec_stmnt = 'select * into ##global_tmp_tbl from openquery(LS_RMT,' + @query + ')';
exec (@exec_stmnt);
commit transaction
go
if object_id('tempdb..#local_tmp_tbl') is not null drop table #local_tmp_tbl;
select * into #local_tmp_tbl from ##global_tmp_tbl;
Здесь LS_RMT
- это связанный сервер, а remote_sp
- это хранимая процедура в базе данных remote_db
на этом связанном сервере.
Когда я пытаюсь поместить этот код в хранимую процедуру, SQL Сервер жалуется, что ##global_tmp_tbl
является недопустимым именем при попытке прочитать его после выполнения хранимой процедуры на связанном сервере, который ее загружает.
Я предполагаю, что область действия глобальной временной таблицы изменяется один раз в контексте хранимой процедуры, но я не могу найти никакой документации о том, почему это может иметь место, поэтому я не уверен.
Это проблема с областью действия или действительно возможно использовать глобальную временную таблицу в хранимой процедуре после того, как она была создана внутри транзакции, которая загружает ее из оператора openquery, и я просто делаю это неправильно?