Использование временной таблицы между хранимыми процедурами в SQL Server 2008

В настоящее время у меня есть основная хранимая процедура, вызывающая множество хранимых процедур:

Main --| 
     --|
       --| > Exec Pre-processing SP (create and populate #temp table)
     --|
       --| > Exec Actual update
     --|
       --| > Exec Post-Process (consume and drop #temp table)

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что мне нужно получить исходные значения из базы данных и значения, передаваемые в основную хранимую процедуру, чтобы я мог выполнить постобработку для обновления на последнем шаге (хранимая процедура), вызываемая .

Я не могу изменить подписи хранимых процедур или основную хранимую процедуру.

Когда я пытаюсь выполнить этот сценарий, я получаю недопустимый объект в хранимой процедуре постобработки.

Как я могу передать свои значения из первой хранимой процедуры в последнюю хранимую процедуру.


person Alexandre Brisebois    schedule 16.05.2011    source источник


Ответы (2)


Вам нужно создать временную таблицу выше в иерархии вызовов, чем все хранимые процессы, которые ее потребляют. Поскольку вы говорите, что не можете изменить Main, единственный шанс сделать это — создать новую самую внешнюю процедуру, которая создает #temp, а затем вызывает Main.

Затем вы можете изменить предварительную процедуру, чтобы заполнить уже существующую таблицу. Вам не нужно явно удалять таблицу где бы то ни было.


В качестве альтернативы вы можете создать постоянную таблицу и включить столбец spid, указывающий, из какого соединения были вставлены данные. Вы также должны убедиться, что любые выборки/удаления в этой таблице снова используют значение @@SPID. Я разместил это как ответ на Session-global временные таблицы

person Damien_The_Unbeliever    schedule 16.05.2011
comment
Я обошел свои ограничения, используя глобальную временную таблицу ## и @@SPID, чтобы получить свои значения из глобальной временной таблицы. - person Alexandre Brisebois; 16.05.2011

Если процедура main всегда выполняется в одном потоке и никогда не будет вызываться параллельно из нескольких соединений, вы можете объявить свою временную таблицу как глобальную временную таблицу (##temp, а не #temp), предполагая, что вы можете изменить внутреннюю процедуру. .

Это не сработает, если main вызывается из нескольких соединений одновременно.

person Ed Harper    schedule 16.05.2011
comment
main вызывается из пользовательского интерфейса приложения и может вызываться параллельно. - person Alexandre Brisebois; 16.05.2011
comment
@Alexandre - в этом случае это решение вам бесполезно. Прости. - person Ed Harper; 16.05.2011