Как проверить существование временной таблицы
SQL Server умеет работать c временными таблицами. Названия у таких таблиц начинаются с одной или с двух решёток (#). Временные таблицы, очевидно, придуманы для того, чтобы хранить в них данные временно. Например, для сохранения промежуточных результатов каких-либо вычислений. Или для передачи каких-то данных от одного процесса другому.
Иногда требуется проверить, была ли уже создана определённая временная таблица или нет. Как это правильно сделать?
Если речь идёт о глобальной временной таблице, то проверить её наличие можно традиционным способом — заглянув в список таблиц. Только не забудьте сделать поправку на то, что все временные таблицы — и глобальные и локальные — создаются не в текущей пользовательской базе данных, а в системной базе TempDB.
Посмотрите на пример. Один процесс создал глобальную временную таблицу. Теперь этот и все другие процессы могут обращаться к ней, как к обыкновенной таблице. В том числе, они увидят её в системных каталогах sys.Tables и Information_Schema.Tables.
Годится. Однако, такой механизм проверки не сработает, если речь идёт о локальных временных таблицах. Ведь такие таблицы создаются индивидуально для каждого сеанса, и в разных сеансах могут оказаться таблицы с одинаковыми названиями. Чтобы не было конфликта имён, сервер переименовывает локальные таблицы, создавая их в TempDB.
Вот я создаю в двух сеансах локальные временные таблицы с одинаковыми названиями. В каждом сеансе сервер отличает свою таблицу от чужих, но в системных каталогах они видны все сразу:
Если посмотреть внимательнее, то можно заметить, что к названиям таблиц сервер дописывает уникальное окончание, по которому он и определяет чья это таблица:
Возиться с этими окончаниями в SQL-коде не хотелось бы. И не нужно. Потому что у нас есть функция Object_ID, которая автоматически выбирает нужную таблицу:
Если объект с заданным названиям существует, то функция Object_ID вернёт его идентификатор, а если нет — NULL. Таким образом мы сможем удобно и надёжно проверить наличие даже такого необычного объекта, как локальная временная таблица:
У этой функции есть необязательный второй параметр, который можно использовать для указания конкретного типа объекта. «U» означает, что мы ищем именно таблицу.
0 комментариев