Ten artykuł przechodzi przez różne wersje instrukcji T-SQL IF EXISTS dla bazy danych SQL, używając różnych przykładów.
- IF EXISTS w SQL 2014 lub wcześniej
- DROP ..IF EXISTS w SQL Server 2016 do SQL Server 2019
Wprowadzenie
Załóżmy, że chcesz wdrożyć obiekty takie jak tabele, procedury, funkcje w bazie danych SQL Server. Jeśli wykonasz instrukcje CREATE dla tych obiektów, a ten obiekt już istnieje w bazie danych, otrzymasz wiadomość 2714, poziom 16, stan 3 komunikat o błędzie, jak pokazano poniżej.
Możesz napisać instrukcję DROP przed wykonaniem instrukcji create. Działa to dobrze, jeśli obiekt istnieje w bazie danych.
W przypadku, gdy obiekt nie istnieje i próbujesz go upuścić, otrzymasz następujący błąd.
Aby uniknąć tej sytuacji, zazwyczaj programiści dodają instrukcję T-SQL If Exists i upuszczają obiekt, jeśli jest on już dostępny w bazie danych.
Powiedzmy, że chcemy wdrożyć procedurę składowaną 'stpGetAllMembers' w testowej bazie danych SQLShack. Możemy użyć wielu metod, aby sprawdzić, czy procedura istnieje w bazie danych SQL, ale zapytajmy o nią tabelę systemową sys.objects.
Poniższy kod wykona za nas poniższe czynności:
- Po pierwsze, wykonuje instrukcję select wewnątrz instrukcji IF Exists
- Jeśli instrukcja select zwróci wartość, że warunek jest TRUE dla IF Exists
- Uruchamia kod wewnątrz instrukcji begin i drukuje komunikat
Jeśli procedura nie istnieje, to nie uruchamia kodu w instrukcji begin.
Teraz chcemy upuścić tę procedurę, jeśli już istnieje w bazie danych. Możemy dodać polecenie DROP PROCEDURE wewnątrz instrukcji begin. Usuwa ono procedurę przechowywaną, jeśli istnieje ona już w bazie danych.
Możemy użyć tej metody również z innymi obiektami SQL Server. Poniższe zapytanie sprawdza istnienie tabeli SQL i usuwa ją, jeśli tam jest.
W artykule, SQL Code Snippets in Azure Data Studio, omówiliśmy snippety kodu do pisania T-SQL. Pomyślałem o sprawdzeniu składni snippetu sqlCreateStoredProc dla nowej procedury składowanej.
Aby wyświetlić definicję tego snippetu, wpisz create proc, naciśnij sqlCreateStoredProc i enter.
Jak widać na poniższym obrazku, ten snippet również wykorzystuje metodę IF EXISTS do pisania procedury składowanej.
DROP IF EXISTS statement
SQL Server 2016 zapewnia rozszerzenie umożliwiające sprawdzenie istnienia obiektu i upuszczenie, jeśli już istnieje. Wprowadza w tym celu polecenie DROP IF EXISTS.
Składnia polecenia DROP IF EXISTS
DROP OBJECT_TYPE OBJECT_NAME
- Upuszcza obiekt, jeśli już istnieje w bazie danych SQL
- Możemy go również użyć do upuszczenia kolumny lub ograniczeń
- Jeśli określony obiekt nie istnieje, to nie daje żadnego komunikatu o błędzie.
Możemy użyć Baza danych, Tabela, Funkcja, Triger, Procedura, Kolumna, Użytkownik, Widok, Schemat, Indeks, Rola dla tego polecenia.
Zrozumiejmy tę nową klauzulę T-SQL IF EXISTS na różnych przykładach.
DROP Stored Procedure IF EXISTS
W poprzednim przykładzie, użyliśmy DROP Stored Procedure stpGetAllMembers w celach demonstracyjnych. Ta procedura przechowywana nie istnieje teraz. Użyjmy nowej metody i spróbujmy upuścić procedurę przechowywaną.
1
|
DROP PROCEDURE IF EXISTS stpGetAllMembers;
|
Możemy dodać dalszy kod taki jak instrukcje print, instrukcje create. Poniższy kod wypisuje komunikat po wykonaniu polecenia DROP PROCEDURE.
1
2
|
DROP PROCEDURE IF EXISTS stpGetAllMembers
PRINT 'Stored proc does not exist'
|
Utwórzmy procedurę składowaną przy użyciu tej nowej składni T-.SQL IF EXISTS. Poniższe zapytanie zrzuca procedurę składowaną, jeśli już istnieje, w przypadku gdy nie istnieje, utworzy ją.
1
2
3
4
5
6
7
8
9
|
DROP PROCEDURE IF EXISTS stpGetAllMembers;
GO
CREATE PROCEDURE stpGetAllMembers
AS
SELECT table_catalog ,
tabela_schema ,
tabela_name ,
tabela_type
FROM INFORMATION_SCHEMA.TABLES;
|
DROP View IF EXISTS
Do upuszczenia widoku możemy użyć poniższego zapytania dla SQL 2016 lub nowszego.
1
2
|
DROP VIEW IF EXISTS vwABC
GO
|
W SQL Server 2014 lub wcześniejszej wersji, używamy następującego kodu. Sprawdza on widoki za pomocą sys.objects dla typu V.
1
2
3
4
|
IF EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N’vwABC')
AND type = N’V')
DROP VIEW vwABC
GO
|
DROP Constraint IF EXISTS
Możemy użyć następującego polecenia, aby usunąć ograniczenie UNIQUE przy użyciu instrukcji DROP CONSTRAINT IF EXISTS.
1
2
|
ALTER TABLE DemoTable DROP CONSTRAINT IF EXISTS EmpID
GO
|
Następujący kod działa w SQL 2014 lub wcześniejszych. Typ UQ w sys.objects odnosi się do ograniczenia UNIQUE.
W przypadku ograniczenia sprawdzającego należy zmienić typ z UQ na C w zapytaniu w wersji SQL 2014 lub wcześniejszej. Nie musimy zmieniać zapytania określonego przy użyciu instrukcji DROP CONSTRAINT IF EXISTS.
DROP TABLE IF EXISTS
Do upuszczenia tabeli SQL możemy użyć instrukcji DROP TABLE IF EXISTS również w wersji SQL Server 2016 lub nowszej.
1
2
|
DROP TABLE IF EXISTS DemoTable
GO
|
W przypadku SQL 2014 lub wcześniejszych wersji, musimy użyć metody IF EXISTS, jak pokazano poniżej. Typ U odnosi się do tabeli SQL zdefiniowanej przez użytkownika.
1
2
3
4
|
IF EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N’DemoTable')
AND type = N’U')
DROP TABLE DemoTable
GO
|
DROP Database IF EXISTS
Możemy wykorzystać nowe skrypty T-.SQL If Exists skrypty do upuszczania bazy danych SQL również dla SQL 2016 lub nowszych.
1
2
|
DROP DATABASE IF EXISTS TargetDB
GO
|
Alternatywnie, użyć poniższego skryptu w wersji SQL 2014 lub niższej. Jest on również ważny w wyższych wersjach SQL Server, jak również.
1
2
3
|
IF EXISTS (SELECT 1 FROM sys.databases WHERE database_id = DB_ID(N’TargetDB'))
DROP DATABASE TargetDB
GO
|
DROP Column IF EXISTS
Czasami wymagamy usunięcia kolumny z tabeli SQL. Dobrą praktyką jest również upuszczanie niechcianych kolumn. Oszczędza to wysiłku silnika SQL i poprawia wydajność zapytania, jednocześnie pobierając mniej rekordów na wyjście.
Usuwamy kolumnę używając polecenia Alter Table. Możemy wykorzystać DROP COLUMN IF EXISTS również w tym wyrażeniu. Załóżmy, że chcemy usunąć kolumnę Kraj z tabeli Pracownicy. Używamy następującego wyrażenia alter table.
1
2
|
ALTER TABLE Employee DROP COLUMN IF EXISTS Country
GO
|
Jest to pojedyncza linia i proste zapytanie. Alternatywnie używamy poniższego zapytania z wykorzystaniem IF Exists. Wydaje się ono być bardziej skomplikowane niż wcześniejsze. Powinniśmy używać najnowszej składni zapytania z obsługiwanymi wersjami SQL Server.
Podsumowanie
W tym artykule zbadaliśmy dwie różne wersje instrukcji T-SQL IF Exists.
- IF EXISTS w SQL 2014 lub wcześniej
- DROP IF EXISTS w SQL Server 2016 lub później
Powinieneś wybrać składnię odpowiednią dla Ciebie. Polecam najnowszą (Drop [object[ IF Exists), jeśli używasz SQL 2016 lub nowszych wersji.
- Autor
- Recent Posts
Raj jest zawsze zainteresowany nowymi wyzwaniami, więc jeśli potrzebujesz pomocy doradczej na dowolny temat poruszony w jego pismach, można się z nim skontaktować pod adresem [email protected]
View all posts by Rajendra Gupta
- Wykonywanie mniejszych i większych aktualizacji wersji dla AWS RDS SQL Server -… Styczeń 29, 2021
- Deploying AWS RDS PostgreSQL instances – January 27, 2021
- Migrating your on-premises SQL databases to AWS RDS SQL Server using AWS DMS – January 25, 2021