In diesem Artikel werden verschiedene Versionen der T-SQL IF EXISTS-Anweisung für die SQL-Datenbank anhand verschiedener Beispiele vorgestellt.
- IF EXISTS in SQL 2014 oder früher
- DROP ..IF EXISTS in SQL Server 2016 bis SQL Server 2019
Einführung
Angenommen, Sie wollen Objekte wie Tabellen, Prozeduren, Funktionen in der SQL Server-Datenbank einsetzen. Wenn Sie CREATE-Anweisungen für diese Objekte ausführen und das Objekt bereits in einer Datenbank existiert, erhalten Sie die unten gezeigte Fehlermeldung 2714, Level 16, State 3.
Sie können eine DROP-Anweisung schreiben, bevor Sie die create-Anweisung ausführen. Das funktioniert gut, wenn das Objekt in der Datenbank existiert.
Wenn das Objekt nicht existiert und Sie versuchen, es zu löschen, erhalten Sie den folgenden Fehler.
Um diese Situation zu vermeiden, fügen Entwickler in der Regel eine T-SQL If Exists-Anweisung hinzu und verwerfen das Objekt, wenn es bereits in der Datenbank vorhanden ist.
Angenommen, wir möchten eine Stored Procedure ’stpGetAllMembers‘ in der SQLShack-Testdatenbank einsetzen. Wir können mehrere Methoden verwenden, um zu prüfen, ob die Prozedur in der SQL-Datenbank vorhanden ist, aber lassen Sie uns die Systemtabelle sys.objects danach abfragen.
Der folgende Code erledigt die folgenden Dinge für uns:
- Zuerst führt er die Select-Anweisung innerhalb des IF Exists aus
- Wenn die Select-Anweisung einen Wert zurückgibt, der die Bedingung TRUE für IF Exists ist
- Er startet den Code innerhalb einer begin-Anweisung und gibt die Meldung aus
Wenn die Prozedur nicht existiert, wird der Code in einer begin-Anweisung nicht ausgeführt.
Jetzt wollen wir diese Prozedur löschen, wenn sie bereits in der Datenbank existiert. Wir können einen DROP PROCEDURE-Befehl innerhalb einer begin-Anweisung hinzufügen. Er löscht die gespeicherte Prozedur, wenn sie bereits in der Datenbank existiert.
Wir können diese Methode auch mit anderen SQL Server-Objekten verwenden. Die folgende Abfrage prüft die Existenz der SQL-Tabelle und löscht sie, wenn sie vorhanden ist.
Im Artikel SQL-Code-Snippets in Azure Data Studio haben wir Code-Snippets zum Schreiben von T-SQL besprochen. Ich dachte daran, die Syntax für das Snippet sqlCreateStoredProc für eine neue Stored Procedure zu überprüfen.
Um diese Snippet-Definition anzuzeigen, geben Sie create proc ein, drücken Sie sqlCreateStoredProc und geben Sie ein.
Wie im folgenden Bild zu sehen ist, verwendet auch dieses Snippet die Methode IF EXISTS zum Schreiben einer Stored Procedure.
DROP IF EXISTS-Anweisung
SQL Server 2016 bietet eine Erweiterung, um die Existenz des Objekts zu prüfen und es zu löschen, wenn es bereits existiert. Zu diesem Zweck führt er den Befehl DROP IF EXISTS ein.
Die Syntax für DROP IF EXISTS
DROP OBJECT_TYPE OBJECT_NAME
- Es löscht das Objekt, wenn es bereits in der SQL-Datenbank existiert
- Wir können es auch verwenden, um die Spalte oder Einschränkungen zu löschen
- Wenn das angegebene Objekt nicht existiert, gibt es keine Fehlermeldung aus. Es setzt die Ausführung für den nächsten Befehl fort
Wir können Datenbank, Tabelle, Funktion, Trigger, Stored Procedure, Spalte, Benutzer, Ansicht, Schema, Index, Rolle für diesen Befehl verwenden.
Lassen Sie uns diese neue T-SQL IF EXISTS-Klausel anhand verschiedener Beispiele verstehen.
DROP Stored Procedure IF EXISTS
Im vorherigen Beispiel haben wir DROP Stored Procedure stpGetAllMembers zu Demonstrationszwecken verwendet. Diese Stored Procedure existiert nun nicht mehr. Lassen Sie uns die neue Methode verwenden und versuchen, die Stored Procedure zu löschen.
1
|
DROP PROCEDURE IF EXISTS stpGetAllMembers;
|
Wir können weiteren Code wie Print-Anweisungen, Create-Anweisungen hinzufügen. Der folgende Code gibt eine Meldung nach dem DROP PROCEDURE-Befehl aus.
1
2
|
DROP PROCEDURE IF EXISTS stpGetAllMembers
PRINT ‚Stored proc does not exist‘
|
Lassen Sie uns die gespeicherte Prozedur mit diesem neuen T-SQL IF EXISTS Befehl. Die folgende Abfrage löscht die Stored Procedure, wenn sie bereits existiert, falls sie nicht existiert, wird eine erstellt.
1
2
3
4
5
6
7
8
9
|
DROP PROCEDURE IF EXISTS stpGetAllMembers;
GO
CREATE PROCEDURE stpGetAllMembers
AS
SELECT table_catalog ,
table_schema ,
table_name ,
table_type
FROM INFORMATION_SCHEMA.TABLES;
|
DROP View IF EXISTS
Wir können die folgende Abfrage für SQL 2016 oder später verwenden, um eine Ansicht zu löschen.
1
2
|
DROP VIEW IF EXISTS vwABC
GO
|
In SQL Server 2014 oder früheren Versionen, verwenden wir den folgenden Code. Er prüft die Ansichten mit sys.objects auf den Typ 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
Wir können den folgenden Befehl verwenden, um eine UNIQUE-Beschränkung mit der Anweisung DROP CONSTRAINT IF EXISTS zu löschen.
1
2
|
ALTER TABLE DemoTable DROP CONSTRAINT IF EXISTS EmpID
GO
|
Der folgende Code funktioniert in SQL 2014 oder früher. Der Typ UQ in den sys.objects bezieht sich auf ein UNIQUE-Constraint.
Für ein Check-Constraint ändern Sie den Typ in der Abfrage von SQL 2014 oder einer früheren Version von UQ auf C. Die mit der Anweisung DROP CONSTRAINT IF EXISTS angegebene Abfrage müssen wir nicht ändern.
DROP TABLE IF EXISTS
Auch in SQL Server 2016 oder höher können wir die Anweisung DROP TABLE IF EXISTS zum Löschen einer SQL-Tabelle verwenden.
1
2
|
DROP TABLE IF EXISTS DemoTable
GO
|
Für SQL 2014 oder vorherige Versionen, müssen wir die IF EXISTS-Methode wie unten gezeigt verwenden. Der Typ U bezieht sich auf eine benutzerdefinierte SQL-Tabelle.
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
Wir können die neuen T-SQL If Exists-Skripte zum Löschen einer SQL-Datenbank auch für SQL 2016 oder später verwenden.
1
2
|
DROP DATABASE IF EXISTS TargetDB
GO
|
Alternativ, verwenden Sie das folgende Skript mit SQL 2014 oder einer niedrigeren Version. Es ist auch in den höheren SQL Server Versionen gültig.
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
Manchmal müssen wir eine Spalte aus einer SQL-Tabelle löschen. Es ist auch eine gute Praxis, unerwünschte Spalten zu löschen. Es spart der SQL-Engine Arbeit und verbessert die Abfrageleistung, während weniger Datensätze für die Ausgabe abgerufen werden.
Wir löschen eine Spalte mithilfe der Anweisung Alter Table. Wir können auch DROP COLUMN IF EXISTS in dieser Alter-Anweisung verwenden. Angenommen, wir wollen eine Spalte „Land“ aus der Tabelle „Mitarbeiter“ löschen. Wir verwenden die folgende alter table-Anweisung.
1
2
|
ALTER TABLE Employee DROP COLUMN IF EXISTS Country
GO
|
Es ist eine einzige Zeile und eine einfache Abfrage. Alternativ dazu verwenden wir die folgende Abfrage mit IF Exists. Sie scheint etwas komplizierter zu sein als die vorherige. Wir sollten die neueste Abfragesyntax mit den unterstützten SQL Server-Versionen verwenden.
Fazit
In diesem Artikel haben wir zwei verschiedene Versionen von T-SQL IF Exists-Anweisungen untersucht.
- IF EXISTS in SQL 2014 oder früher
- DROP IF EXISTS in SQL Server 2016 oder später
Sie sollten die für Sie geeignete Syntax wählen. Ich würde die neueste (Drop [object[ IF Exists) empfehlen, wenn Sie mit SQL 2016 oder späteren Versionen arbeiten.
- Author
- Recent Posts
Mit seiner 50-teiligen Serie über SQL Server Always On Availability Groups ist er der Schöpfer einer der größten kostenlosen Online-Sammlungen von Artikeln zu einem einzigen Thema. Aufgrund seines Beitrags zur SQL Server-Community wurde er mit verschiedenen Auszeichnungen geehrt, u.a. wurde er 2020 und 2021 auf der SQLShack kontinuierlich zum „Besten Autor des Jahres“ gekürt.
Raj ist immer an neuen Herausforderungen interessiert, wenn Sie also Beratungshilfe zu einem der in seinen Schriften behandelten Themen benötigen, können Sie ihn unter [email protected] erreichen
Alle Beiträge von Rajendra Gupta anzeigen
- Durchführen von Minor- und Major-Versions-Upgrades für AWS RDS SQL Server. 29. Januar, 2021
- Bereitstellen von AWS RDS PostgreSQL-Instanzen – 27. Januar 2021
- Migrieren Ihrer lokalen SQL-Datenbanken zu AWS RDS SQL Server mithilfe von AWS DMS – 25. Januar 2021