Использование временной таблицы между хранимыми процедурами в SQL Server 2008
В настоящее время у меня есть основная хранимая процедура, вызывающая много хранимых процедур:
Main --|
--|
--| > Exec Pre-processing SP (create and populate #temp table)
--|
--| > Exec Actual update
--|
--| > Exec Post-Process (consume and drop #temp table)
Проблема, с которой я сталкиваюсь в настоящее время, заключается в том, что мне нужно извлечь исходные значения из базы данных и передать значения в основную хранимую процедуру, чтобы я мог выполнить постобработку до обновления на последнем вызываемом шаге (хранимая процедура),
Я не могу изменить сигнатуры хранимых процедур или основной хранимой процедуры.
Когда я пытаюсь выполнить этот сценарий, я получаю недопустимый объект в хранимой процедуре постобработки.
Как я могу передать свои значения из первой хранимой процедуры в последнюю хранимую процедуру.
2 ответа
Вам нужно создать временную таблицу выше в иерархии вызовов, чем все хранимые процессы, которые ее используют. Поскольку вы говорите, что не можете изменить Main
Единственный шанс сделать это будет создать новую внешнюю процедуру, которая создает #temp
а потом звонит Main
,
Затем вы можете изменить предварительную процедуру, чтобы заполнить уже существующую таблицу. Вам не нужно явно отбрасывать таблицу в любом месте.
Кроме того, вы можете создать постоянную таблицу и включить столбец spid, в котором указано, из каких данных подключения были вставлены данные. Вы также должны убедиться, что любые операции выбора / удаления в этой таблице снова используют @@SPID
значение. Я опубликовал это как ответ на глобальные временные таблицы Session
Если main
процедура всегда выполняется в одном потоке и никогда не будет вызываться параллельно из нескольких соединений, вы можете объявить вашу временную таблицу как глобальную временную таблицу (##temp
в отличие от #temp
), предполагая, что вы можете изменить внутреннюю процедуру.
Это не сработает, если main
вызывается из нескольких соединений одновременно.