Приведенная ниже версия позволяет избежать всех хлопот, связанных с '_'
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