Удалить все временные таблицы для экземпляра - PullRequest
10 голосов
/ 31 марта 2011

Мне было интересно, как / если возможно иметь запрос, который удаляет все временные таблицы?

Я пытался что-то решить, используя tempdb.sys.tables, но пытаюсь отформатироватьстолбец имени, чтобы сделать его чем-то, что затем может быть отброшено - еще один фактор, который немного усложняет ситуацию, заключается в том, что часто имена временных таблиц содержат '_', что означает, что выполнение замены становится немного более неудобным (по крайней мере для меня!)

Есть ли что-нибудь, что я могу использовать, чтобы отбрасывать все временные таблицы (локальные или глобальные) без необходимости отбрасывать их все по отдельности на именованной основе?

Спасибо!

Ответы [ 3 ]

14 голосов
/ 31 марта 2011

Смысл временных таблиц в том, что они ... временные.Как только они выходят из области действия

  • # temp, создать в хранимой процедуре: сохраненная процедура завершается
  • # temp, созданной в сеансе: сеанс отключается
  • ## temp: сеанс, который создал, отключает

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

Для глобальных таблиц это сгенерирует и выполнит оператор, чтобы отбросить их все.

declare @sql nvarchar(max)
select @sql = isnull(@sql+';', '') + 'drop table ' + quotename(name)
from tempdb..sysobjects
where name like '##%'
exec (@sql)

Плохо было бы отбрасывать [глобальные] временные таблицы других сеансов.

Для локальных ( для этого сеанса ) временных таблиц просто отключите и снова подключите снова.

12 голосов
/ 24 марта 2014

Приведенная ниже версия позволяет избежать всех хлопот, связанных с '_' s.Я просто хотел избавиться от неглобальных временных таблиц, поэтому '#[^#]%' в моем предложении WHERE, удалите [^#], если вы также хотите удалить глобальные временные таблицы, или используйте '##%', если вы только хотите удалить глобальные временные таблицы.

Кажется, что оператор DROP счастлив взять полное имя с '_' и т. Д., Поэтому нам не нужно манипулировать и редактировать их.OBJECT_ID(...) NOT NULL позволяет мне избегать таблиц, которые не были созданы моим сеансом, предположительно, поскольку эти таблицы не должны быть «видимыми» для меня, они возвращаются с NULL из этого вызова.QUOTENAME необходим, чтобы удостовериться, что имя правильно указано / экранировано.Если у вас нет временных таблиц, @d_sql будет пустой строкой, поэтому мы проверяем это перед печатью / выполнением.

DECLARE @d_sql NVARCHAR(MAX)
SET @d_sql = ''

SELECT @d_sql = @d_sql + 'DROP TABLE ' + QUOTENAME(name) + ';
'
FROM tempdb..sysobjects
WHERE name like '#[^#]%'
AND OBJECT_ID('tempdb..'+QUOTENAME(name)) IS NOT NULL

IF @d_sql <> ''
BEGIN
    PRINT @d_sql
    -- EXEC( @d_sql )
END
4 голосов
/ 19 июля 2015

В хранимой процедуре они автоматически удаляются по завершении выполнения процедуры.

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

Закрытие и повторное открытие соединения работает, как указано в принятом ответе.Вместо того, чтобы делать это вручную после каждого выполнения, вы можете включить режим SQLCMD в меню «Запрос» в SSMS

enter image description here

, а затем использовать команду :connect (настроить имя вашего сервера / экземпляра))

:connect (local)\SQL2014

create table #foo(x int)

create table #bar(x int)

select *
from #foo

Может быть запущен несколько раз без проблем.Вкладка сообщений показывает

Соединение с (локальным) \ SQL2014 ...

(затронуто 0 строк)

Отключение соединения от (локального) \SQL2014 ...

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