SQL Server 2005 и временная таблица
Я читал о временных таблицах и области, и все ответы, которые я видел, похоже, не говорят об одной из моих проблем.
Я понимаю, что локальная временная область таблицы действительна только при использовании времени хранимой процедуры или дочерних хранимых процедур. Однако какова ситуация с соглашением. т.е. если у меня есть хранимая процедура, которая создает временную таблицу, которая вызывается из двух разных процессов, но из одной и той же строки пользователя/соединения, эта временная таблица будет разделяться между двумя вызовами этой хранимой процедуры или будет ли это случай каждый вызов хранимой процедуры создает уникальный экземпляр временной таблицы.
Я бы предположил, что временная таблица относится к области вызова для хранимого procdure, но я хочу быть уверенным, прежде чем перейти по пути с этим.
Ответы
Ответ 1
Локальные временные таблицы (начинаются С#) ограничены вашей сессией; другие сеансы, даже из одной и той же строки пользователя/подключения, не могут их видеть. Правила для времени жизни зависят от того, была ли локальная временная таблица создана в хранимой процедуре:
- Локальная временная таблица, созданная в хранимой процедуре, отбрасывается при завершении процедуры; другие хранимые процедуры или вызывающий процесс не могут их видеть.
- Другие локальные временные таблицы удаляются при завершении сеанса.
Глобальные временные таблицы (начало С##) распределяются между сеансами. Они отбрасываются, когда:
- Сессия, которая их создала, заканчивается.
- И ни один другой сеанс не относится к ним
Эта команда может быть полезна, чтобы увидеть, какие временные таблицы существуют:
select TABLE_NAME from tempdb.information_schema.tables
И это удобно для удаления временных таблиц, если вы не уверены, что они существуют:
if object_id('tempdb..#SoTest') is not null drop table #SoTest
Для получения дополнительной информации см. статью MSDN.
Ответ 2
Временная таблица будет доступна для экземпляра процедуры, которая ее создает.
Следующий script
Exec ('Select 1 as col Into #Temp Select * From #Temp')
Exec ('Select 2 as col Into #Temp Select * From #Temp')
Возвращает
Col
1
Col
2
Не
Col
1
2
Или ошибка, потому что таблица уже существует.
Временная таблица также будет доступна любым "дочерним" процедурам, которые также выполняются при начальной процедуре.
Ответ 3
Следующая статья может помочь:
"Как делиться данными между хранимыми процедурами"
http://www.sommarskog.se/share_data.html
Ответ 4
Вы также можете подумать об использовании переменных таблицы. У них очень четкая область действия, и они иногда быстрее, чем их временные таблицы. Единственная проблема с переменными таблицы заключается в том, что они не могут быть проиндексированы, поэтому некоторые характеристики могут быть потеряны, несмотря на их характер. Проверить здесь для получения дополнительной информации по этому вопросу.