Как можно проверить существование таблицы

SQL во всех проявлениях - от ANSI-92 до TSQL.

Модераторы: Yurich, Absurd

Ответить
Viktor Zull
Сообщения: 117
Зарегистрирован: 10 ноя 2005, 02:00

Подскажите как можно проверить существование временной таблица
условите такого типа:
если ##Table2 существует, тогда drop table ##Table2
иначе ....
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

Viktor Zull, СУБД какая? В стандарте 99-го года зарезервировано ключевое слово exists.
Я знаю два варианта использования:

Код: Выделить всё

drop table if exists ##table2;
и

Код: Выделить всё

if exists (select 1 from tempdb.dbo.sysobjects where id = object_id('##table2')) 
drop table ##table2
Наверняка есть и ещё :)
Даже самый дурацкий замысел можно воплотить мастерски
Viktor Zull
Сообщения: 117
Зарегистрирован: 10 ноя 2005, 02:00

СУБД MS SQL Server, думаю что первый вариант подойдет. Первый код я понимаю: удалить таблицу если она существует, а вот второй не совсем, немогли бы вы пояснить его
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

Как раз наоборот :) Может 2000-й и поймёт первый вариант, но что-то я сумлеваюсь :) А справки под рукой нет.

По второму поясняю: EXISTS проверяет возращаемый запросом резалсет на непустоту.
Записи обо всех объектах базы при их создании заносятся в системную таблицу sysobjects. Временные таблицы сосдаются в системной базе под названием tempdb. Владелец системной таблицы всегда dbo. ID объекта определяется при помощи системной функции object_id.
Даже самый дурацкий замысел можно воплотить мастерски
Viktor Zull
Сообщения: 117
Зарегистрирован: 10 ноя 2005, 02:00

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

--Сначала проверить существует ли таблица ##Table2 и если существует удалить ее:
if exists (select 1 from tempdb.dbo.sysobjects where id = object_id('##table2'))
drop table ##table2

--Если не существует тогда выполнить:
select pole1,pole2,pole3 into ##Table2
from TableX
where(...)
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

М-дя. Для глобальных временных таблиц object_id NULL возвращает. Для локальных катит полное имя tempdb..#table2, а для глобальных - только если сделать use tempdb перед этим.
Значит замени условия на where name = '##table'
Даже самый дурацкий замысел можно воплотить мастерски
Ответить