Область временного стола? - PullRequest
8 голосов
/ 26 июля 2010

Я использую временные таблицы #tempTable в моей хранимой процедуре, которые я использую для запуска своих отчетов ASP.net (службы отчетов)

Я делаю что-то вроде

, например,Код

SELECT * INTO #tempTable FROM Contacts WHERE ContactID < 10

Затем я использую что-то вроде

SELECT o.* FROM #tempTable t INNER JOIN Orders o ON t.ContactID =o.ContactID

, чтобы вернуть значения в мои отчеты или результаты для хранимой процедуры

Я не избавляюсь от своего #tempTable

то есть я не делаю

DROP TABLE #tempTable

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

Ответы [ 4 ]

11 голосов
/ 27 июля 2010

Во-первых, локальные временные таблицы, созданные в процедуре, удаляются после завершения процедуры.Из BOL при создании таблицы :

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

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

Я говорю "эффективно", чтобы поднять еще один пункт.Я бы не рекомендовал удалять временную таблицу в конце вашей процедуры, хотя я бы добавил проверку непосредственно перед созданием временной таблицы и удалил ее, если она существует (например, if object_id('tempdb..#Foo') is not null).Аргумент против удаления временной таблицы в конце состоит в том, что, вызывая оператор Drop, вы заставляете SQL Server тратить ресурсы на уничтожение таблицы, ожидая завершения процедуры.Если вместо этого вы позволите ему выйти из области видимости, ваша процедура немедленно завершится, и вы позволите SQL Server уничтожить таблицу в любой момент по своему выбору.

7 голосов
/ 27 марта 2012

Таблица #Temp ограничена областью применения ВАШЕЙ СЕССИИ и продолжительностью жизни пакета, что означает, что никто другой не сможет увидеть вашу временную таблицу, а кто-либо еще может создать свою собственную таблицу #Temp с тем же именем.По окончании сеанса или пакета SQL Server очистит временную таблицу.

В другом примечании временная таблица ## ведет себя как обычная таблица.Это может увидеть каждый, и не может быть более 1 ## таблицы с одним и тем же именем.SQL Server будет очищать эти ## временные таблицы при перезапуске сервера.

2 голосов
/ 26 июля 2010

Хорошей практикой кодирования считается явное удаление каждой созданной вами временной таблицы.Если вы выполняете сценарии через SQL Server Management Studio / Query Analyzer, временные таблицы сохраняются до тех пор, пока вы явно не удалите их или не закроете сеанс.

1 голос
/ 27 июля 2010

В общем, у вас, вероятно, не будет проблем, если вы не удалите временные таблицы. Локальная временная таблица имеет область видимости сеанса или область видимости SP в вашем случае. Он автоматически сбрасывается при закрытии сеанса или завершении SP.

Тем не менее, вы повышаете риск возникновения проблем, регулярно следуя этой практике. Например, если вы не используете SP, но отправляете оператор SELECT из ASP .net и оставляете соединение SQL Server открытым, временная таблица будет продолжать существовать. Продолжение использования соединения и других временных таблиц приведет к увеличению временной базы данных.

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

...