В ранних версиях SQL Server (до 2017) при удалении несуществующей таблицы таблицы вы получали сообщение об ошибке:
"Не удалось удалить таблица "t1", так как он не существует или отсутствуют разрешения."
В рамках интерактивного (чистого) SQL избежать возникновения ошибки в этом случае не получалось. Однако проблема легко решается процедурно (T-SQL):
IF object_id('t1') IS NOT NULL
DROP TABLE t1;
Встроенная функция object_id возвращает идентификатор объекта, заданного именем, или же NULL, если такого имени не существует.
И вот в SQL Server 2017 появился оператор DROP TABLE IF EXISTS, который не вызывает ошибки, если удаляемой таблицы не существует, например:
DROP TABLE IF EXISTS t1;
Теперь предположим, что нам нужно удалить связанные таблицы. Рассмотрим следующий пример:
CREATE TABLE t1(id INT IDENTITY PRIMARY KEY);
CREATE TABLE t2(id INT IDENTITY PRIMARY KEY,
t1_id INT REFERENCES t1);
GO
INSERT INTO T1 DEFAULT VALUES;
GO 3 -- выполним предыдущий пакет (т.е. вставку) 3 раза
Проверим
SELECT * FROM t1;
id
1
2
3
INSERT INTO t2(t1_id) VALUES(1),(2);
SELECT * FROM t2;
id t1_id
1 1
2 2
Стандартное каскадное удаление
DROP TABLE t1 CASCADE;
работать не будет, т.к. оно еще не реализовано в SQL Server (но работает, например, в PostgreSQL), тогда как оператор
DROP TABLE t1;
вызовет следующую ошибку:
"Невозможно удалить объект "t1", так как на него ссылается ограничение FOREIGN KEY."
Мы можем удалить связанные таблицы одним оператором, перечислив их через запятую (сначала подчиненную таблицу, а затем - главную):
DROP TABLE t2,t1;
Если указать таблицы в неправильном порядке, т.е. t1,t2, то при удалении t1 будет получена вышеприведенная ошибка, а потом будет удалена t2.
Если среди перечисленных таблиц (не обязательно две) могут быть отсутствующие, то тогда поможет новый оператор:
DROP TABLE IF EXISTS t2,t1;
Заметим, что оператор DROP ... IF EXISTS может применяться и к другим объектам базы данных, например, представлениям и хранимым процедурам.
Возможно, что в следующих версиях SQL Server может появиться и оператор типа:
CREATE TABLE IF NOT EXISTS...
который будет создавать таблицу только в том случае, если такой не существует.