Использование временной таблицы между хранимыми процедурами в SQL Server 2008 - PullRequest
2 голосов
/ 16 мая 2011

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

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

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

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

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

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

Ответы [ 2 ]

6 голосов
/ 16 мая 2011

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

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


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

2 голосов
/ 16 мая 2011

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

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

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