В SQL Server, ако се опитате да пуснете обект, който не съществува, ще получите грешка. Ако не искате да получите грешка, ще трябва да добавите допълнителен код, за да проверите за съществуването на обекта.
Преди SQL Server 2016 трябваше да добавите IF
оператор, който е поискал съответните системни обекти, за да разбере дали обектът съществува или не.
От SQL Server 2016 вече можете да използвате нов, по-чист метод, за да проверите дали даден обект съществува. Ще го наречем DROP IF EXISTS
(известен по друг начин като „DIE“).
Пример 1 – Основен синтаксис
Синтаксисът всъщност не съдържа DROP IF EXISTS
низ такъв, какъвто е. Това, което трябва да направите, е да вмъкнете типа обект между DROP
и IF
.
DROP TABLE IF EXISTS Customers
В този случай пускам таблица, така че думата TABLE
се вмъква между DROP
и IF
. Името на таблицата, която искам да пусна (в този случай Клиенти ) се поставя в края.
Пример 2 – Основна демонстрация
Ето пример за създаване на база данни, след което я изпускате и след това се опитвате да я изхвърлите отново.
CREATE DATABASE Homer; GO DROP DATABASE IF EXISTS Homer; GO DROP DATABASE IF EXISTS Homer; GO
Резултат:
Started executing query at Line 17 Commands completed successfully. Started executing query at Line 19 Commands completed successfully. Started executing query at Line 21 Commands completed successfully.
Не се появяват грешки, въпреки че се опитвам да пусна несъществуващ обект на третия ред.
Пример 3 – Без IF EXISTS
Ето го отново, освен че този път премахвам IF EXISTS
част.
CREATE DATABASE Homer; GO DROP DATABASE Homer; GO DROP DATABASE Homer; GO
Резултат:
Started executing query at Line 17 Commands completed successfully. Started executing query at Line 19 Commands completed successfully. Started executing query at Line 21 Msg 3701, Level 11, State 1, Line 5 Cannot drop the database 'Homer', because it does not exist or you do not have permission.
В този случай получавам грешка, защото се опитва да пусне обект, който не съществува.
Пример 4 – Колони и ограничения
Можете също да използвате DIE за колони и ограничения.
Например, можете да използвате DROP COLUMN IF EXISTS
във вашата ALTER TABLE
изявление.
Ето един пример.
DROP TABLE IF EXISTS DieTest; GO CREATE TABLE DieTest ( DieTestId uniqueidentifier NOT NULL DEFAULT NEWID(), DieTestName varchar(70), InsertDate datetime2(7) NOT NULL DEFAULT GETDATE() ); GO ALTER TABLE DieTest DROP COLUMN IF EXISTS DieTestName; GO ALTER TABLE DieTest DROP COLUMN IF EXISTS DieTestName; GO
Резултат:
Started executing query at Line 1 Commands completed successfully. Started executing query at Line 3 Commands completed successfully. Started executing query at Line 11 Commands completed successfully. Started executing query at Line 15 Commands completed successfully.
Пример 5 – Преди SQL Server 2016
Преди SQL Server 2016, за да тествате съществуването на обект, трябва да направите нещо подобно:
IF DB_ID('Homer') IS NOT NULL DROP DATABASE Homer;
Този пример използва DB_ID()
защото имаме работа с база данни. Ако обектът е от различен тип, може да се наложи да използвате OBJECT_ID()
функция или нещо съвсем друго.
Например:
IF OBJECT_ID('dbo.Customers, 'U') IS NOT NULL DROP TABLE dbo.Customers; IF EXISTS (SELECT * FROM sys.triggers WHERE name = 'MyTrigger') DROP TRIGGER MyTrigger
След като започнем да разглеждаме този код, можем да видим защо DROP IF EXISTS
е добре дошло допълнение към синтаксиса на T-SQL.
Допустими обекти
DIE може да се използва за следните обекти.
АГРЕГАТ | ПРОЦЕДУРА | ТАБЛИЦА |
МОНТАЖ | РОЛЯ | ПУСК |
ПРЕГЛЕД | ПРАВИЛО | ТИП |
БАЗА ДАННИ | СХЕМА | ПОТРЕБИТЕЛ |
ПО ПОДРАЗБИРАНЕ | ПОЛИТИКА ЗА СИГУРНОСТ | ПРЕГЛЕД |
ФУНКЦИЯ | ПОСЛЕДОВАТЕЛНОСТ | |
ИНДЕКС | СИНОНИМ |
Както споменахме, DIE може да се използва и върху колони и ограничения, когато се използва ALTER TABLE
изявление:
- ПРОМЕНИ КОЛОНАТА ИЗПУСКАНЕ НА ТАБЛИЦА АКО СЪЩЕСТВУВА
- ПРОМЕНИ ОГРАНИЧЕНИЕТО ЗА ОТПУСКАНЕ НА ТАБЛИЦА АКО СЪЩЕСТВУВА