SQLShack (Polski)

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

iv

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

Jako certyfikowany MCSA i Microsoft Certified Trainer w Gurgaon, Indie, z 13-letnim doświadczeniem, Rajendra pracuje dla różnych dużych firm, koncentrując się na optymalizacji wydajności, monitorowaniu, wysokiej dostępności oraz strategiach i wdrażaniu odzyskiwania danych po awarii. Jest autorem setek autorytatywnych artykułów na temat SQL Server, Azure, MySQL, Linux, Power BI, Performance tuning, AWS/Amazon RDS, Git i pokrewnych technologii, które do tej pory zostały obejrzane przez ponad 10 milionów czytelników. est twórcą jednego z największych darmowych zbiorów artykułów online na jeden temat, z jego 50-częściową serią na temat SQL Server Always On Availability Groups. W oparciu o jego wkład w społeczność SQL Server, został wyróżniony różnymi nagrodami, w tym prestiżową nagrodą „Najlepszy autor roku” nieprzerwanie w 2020 i 2021 roku na SQLShack.
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

Najnowsze posty autorstwa Rajendra Gupta (zobacz wszystkie)
  • 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

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *