Самородов Федір Анатолійович. Як перевірити існування тимчасової таблиці
SQL Server вміє працювати c тимчасовими таблицями. Назви у таких таблиць починаються з одного або з двох решіток (#). Тимчасові таблиці, очевидно, придумані для того, щоб зберігати в них дані тимчасово. Наприклад, для збереження проміжних результатів будь-яких обчислень. Або для передачі якихось даних від одного процесу іншому.
Іноді потрібно перевірити, чи була вже створена певна тимчасова таблиця чи ні. Як це правильно зробити?
Якщо мова йде про глобальну тимчасової таблиці, то перевірити її наявність можна традиційним способом - заглянувши в список таблиць. Тільки не забудьте зробити поправку на те, що всі тимчасові таблиці - і глобальні і локальні - створюються не в поточної користувальницької базі даних, а в системній базі TempDB.
Подивіться на приклад. Один процес створив глобальну тимчасову таблицю. Тепер цей і всі інші процеси можуть звертатися до неї, як до звичайної таблиці. В тому числі, вони побачать її в системних каталогах sys.Tables і Information_Schema.Tables.
Годиться. Однак, такий механізм перевірки не спрацює, якщо мова йде про локальні тимчасових таблицях. Адже такі таблиці створюються індивідуально для кожного сеансу, і в різних сеансах можуть виявитися таблиці з однаковими назвами. Щоб не було конфлікту імен, сервер перейменовує локальні таблиці, створюючи їх у TempDB.
Ось я створюю в двох сенсах локальні тимчасові таблиці з однаковими назвами. У кожному сеансі сервер відрізняє свою таблицю від чужих, але в системних каталогах їх видно все відразу:
Якщо подивитися уважніше, то можна помітити, що до назв таблиць сервер дописує унікальне закінчення, за яким він і визначає чия це таблиця:
Возитися з цими закінченнями в SQL-коді не хотілося б. І не потрібно. Тому що у нас є функція Object_ID. яка автоматично вибирає потрібну таблицю:
Якщо об'єкт із заданим назв існує, то функція Object_ID поверне його ідентифікатор, а якщо немає - NULL. Таким чином ми зможемо зручно і надійно перевірити наявність навіть такого незвичайного об'єкту, як локальна тимчасова таблиця:
У цій функції є необов'язковий другий параметр, який можна використовувати для вказівки конкретного типу об'єкта. "U" означає, що ми шукаємо саме таблицю.