SQL Server 2005 и область временных таблиц - PullRequest
46 голосов
/ 21 мая 2009

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

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

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

Ответы [ 4 ]

76 голосов
/ 21 мая 2009

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

  • Локальная временная таблица, созданная в хранимой процедуре, удаляется после завершения процедуры; другие хранимые процедуры или вызывающий процесс не могут их видеть.
  • Другие локальные временные таблицы удаляются по окончании сеанса.

Глобальные временные таблицы (начинаются с ##) распределяются между сеансами. Они сбрасываются, когда:

  • Сессия, которая их создала, заканчивается
  • И никакой другой сеанс не ссылается на них

Эта команда может быть полезна для просмотра существующих временных таблиц:

select TABLE_NAME from tempdb.information_schema.tables 

И это удобно для удаления временных таблиц, если вы не уверены, что они существуют:

if object_id('tempdb..#SoTest') is not null drop table #SoTest

См. Эту статью MSDN для получения дополнительной информации.

11 голосов
/ 21 мая 2009

Временная таблица будет доступна для экземпляра процедуры, которая ее создает

Следующий скрипт

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 голосов
/ 21 мая 2009

Следующая статья может помочь: «Как обмениваться данными между хранимыми процедурами» http://www.sommarskog.se/share_data.html

1 голос
/ 21 мая 2009

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

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