Подтвердить что ты не робот

SQL Server 2005 и временная таблица

Я читал о временных таблицах и области, и все ответы, которые я видел, похоже, не говорят об одной из моих проблем.

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

Я бы предположил, что временная таблица относится к области вызова для хранимого procdure, но я хочу быть уверенным, прежде чем перейти по пути с этим.

4b9b3361

Ответ 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

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