Область действия глобальной временной таблицы ведет себя по-разному внутри хранимой процедуры - PullRequest
0 голосов
/ 11 марта 2020

Следующий код выполняется успешно, если я не добавлю 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, и я просто делаю это неправильно?

1 Ответ

0 голосов
/ 11 марта 2020

Хотя я не совсем уверен, почему приведенный выше код работает вне контекста хранимой процедуры, я определил, что встраивание всех ссылок на глобальную временную таблицу в зафиксированную транзакцию позволяет хранимой процедуре работать. Так что-то вроде следующего:

use db_name
go

create procedure dbo.proc_name
@sp_date date = NULL

as
if isnull(@sp_date,'') = ''
begin
  select @sp_date = getdate();
end


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);

if object_id('tempdb..#local_tmp_tbl') is not null drop table #local_tmp_tbl;
select * into #local_tmp_tbl from ##global_tmp_tbl;

commit transaction
go
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...