Dit artikel loopt door verschillende versies van het T-SQL IF EXISTS statement voor de SQL database aan de hand van verschillende voorbeelden.
- IF EXISTS in SQL 2014 of eerder
- DROP ..IF EXISTS in SQL Server 2016 tot SQL Server 2019
Inleiding
Voorstel dat u objecten zoals tabellen, procedures, functies in de SQL Server database wilt implementeren. Als u CREATE-statements voor deze objecten uitvoert en dat object bestaat al in een database, krijgt u bericht 2714, level 16, state 3 foutmelding zoals hieronder wordt weergegeven.
U kunt een DROP-statement schrijven voordat u het create-statement uitvoert.
In het geval dat het object niet bestaat, en je probeert het te droppen, krijg je de volgende foutmelding.
Om deze situatie te voorkomen, voegen ontwikkelaars gewoonlijk T-SQL If Exists statement toe en laten het object vallen als het al in de database aanwezig is.
Stel dat we een opgeslagen procedure ‘stpGetAllMembers’ willen implementeren in de SQLShack-testdatabase. We kunnen meerdere methoden gebruiken om te controleren of de procedure in de SQL-database bestaat, maar laten we sys.objects system table er eens naar vragen.
De volgende code doet de onderstaande dingen voor ons:
- Eerst wordt het select statement binnen IF Exists uitgevoerd
- Als het select statement een waarde retourneert die voorwaarde is TRUE voor IF Exists
- Het start de code binnen een beginstatement en drukt het bericht af
Als de procedure niet bestaat, wordt de code in een beginverklaring niet uitgevoerd.
Nu willen we deze procedure laten vallen als deze al in de database bestaat. We kunnen een DROP PROCEDURE commando toevoegen in een begin-statement. Hiermee wordt de opgeslagen procedure verwijderd als deze al in de database bestaat.
We kunnen deze methode ook met andere SQL Server-objecten gebruiken. De volgende query controleert of de SQL-tabel bestaat en verwijdert deze als dat het geval is.
In het artikel SQL Code Snippets in Azure Data Studio bespraken we code snippets voor het schrijven van T-SQL. Ik dacht aan het controleren van de syntaxis voor de sqlCreateStoredProc-snippet voor een nieuwe opgeslagen procedure.
Om de definitie van deze snippet te bekijken, typt u create proc, drukt u op sqlCreateStoredProc en voert u enter in.
Zoals te zien is in de volgende afbeelding, gebruikt deze snippet ook de IF EXISTS-methode voor het schrijven van een opgeslagen procedure.
DROP IF EXISTS statement
SQL Server 2016 biedt een verbetering om het bestaan van het object te controleren en te droppen als het al bestaat. Het introduceert DROP IF EXISTS commando voor dit doel.
De syntaxis voor DROP IF EXISTS
DROP OBJECT_TYPE OBJECT_NAME
- Het laat het object vallen als het al bestaat in de SQL-database
- We kunnen het ook gebruiken om de kolom of constraints ook te laten vallen
- Als het opgegeven object niet bestaat, geeft het geen foutmelding. Het gaat verder met de uitvoering van het volgende commando
We kunnen Database, Tabel, Functie, Trigger, Stored Procedure, Kolom, Gebruiker, View, Schema, Index, Rol voor dit commando gebruiken.
Laten we deze nieuwe T-SQL IF EXISTS clausule eens begrijpen aan de hand van verschillende voorbeelden.
DROP Stored Procedure IF EXISTS
In het vorige voorbeeld hebben we DROP Stored Procedure stpGetAllMembers gebruikt voor demonstratiedoeleinden. Deze opgeslagen procedure bestaat nu niet meer. Laten we de nieuwe methode gebruiken en proberen de opgeslagen procedure te laten vallen.
1
DROP PROCEDURE IF EXISTS stpGetAllMembers;
|
We kunnen nog meer code toevoegen, zoals print-statements, create-statements. De volgende code drukt een bericht af na de DROP PROCEDURE-opdracht.
1
2
|
DROP PROCEDURE IF EXISTS stpGetAllMembers
PRINT ‘Opgeslagen proc bestaat niet’
|
Laten we de opgeslagen procedure maken met behulp van deze nieuwe syntaxis T-SQL IF EXISTS commando. De volgende query laat de opgeslagen procedure vallen als deze al bestaat, en als deze niet bestaat, wordt er een aangemaakt.
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
We kunnen de volgende query gebruiken voor SQL 2016 of later om een view te laten vallen.
1
2
|
DROP VIEW IF EXISTS vwABC
GO
|
In SQL Server 2014 of eerdere versie, gebruiken we de volgende code. Deze controleert de weergaven met sys.objects op type 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
We kunnen het volgende commando gebruiken om een UNIQUE constraint te verwijderen met het DROP CONSTRAINT IF EXISTS statement.
1
2
|
ALTER TABLE DemoTable DROP CONSTRAINT IF EXISTS EmpID
GO
|
De volgende code werkt in SQL 2014 of eerder. Type UQ in de sys.objects verwijst naar een UNIQUE constraint.
Voor een controleconstraint wijzigt u het type van UQ in C in de query van SQL 2014 of eerdere versies. We hoeven de query die is opgegeven met DROP CONSTRAINT IF EXISTS statement niet te wijzigen.
DROP Table IF EXISTS
We kunnen DROP TABLE IF EXISTS statement ook gebruiken om een SQL-tabel te laten vallen in SQL Server 2016 of later.
1
2
|
DROP TABLE IF EXISTS DemoTable
GO
|
Voor SQL 2014 of eerdere versies, moeten we de IF EXISTS-methode gebruiken, zoals hieronder wordt weergegeven. Type U verwijst naar een door de gebruiker gedefinieerde SQL-tabel.
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
We kunnen de nieuwe T-SQL If Exists-scripts gebruiken om een SQL-database te droppen, ook voor SQL 2016 of hoger.
1
2
|
DROP DATABASE IF EXISTS TargetDB
GO
|
Een andere mogelijkheid, gebruik het volgende script met SQL 2014 of een lagere versie. Het is ook geldig in de hogere SQL Server-versies.
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
Soms is het nodig een kolom uit een SQL-tabel te verwijderen. Het is ook een goede gewoonte om ongewenste kolommen te verwijderen. Het bespaart de SQL-engine moeite en verbetert de queryprestaties terwijl er minder records voor de uitvoer worden opgehaald.
We laten een kolom vallen met behulp van het Alter Table statement. We kunnen DROP COLUMN IF EXISTS ook gebruiken in dit alter statement. Stel dat we een kolom Country willen verwijderen uit de tabel Employee. We gebruiken het volgende alter table statement.
1
2
|
ALTER TABLE Employee DROP COLUMN IF EXISTS Country
GO
|
Het is een enkele regel en een ongecompliceerde query. Als alternatief gebruiken we de volgende query met IF Exists. Het lijkt ingewikkelder te zijn dan de vorige. We moeten de nieuwste query-syntaxis gebruiken met de ondersteunde SQL Server-versies.
Conclusie
In dit artikel hebben we twee verschillende versies van T-SQL IF Exists statements verkend.
- IF EXISTS in SQL 2014 of eerder
- DROP IF EXISTS in SQL Server 2016 of later
U moet de syntaxis kiezen die voor u geschikt is. Ik zou de nieuwste aanraden (Drop [object[ IF Exists), als u zich op SQL 2016 of latere versies bevindt.
- Auteur
- Recent Posts
Hij is de maker van een van de grootste gratis online verzamelingen van artikelen over een enkel onderwerp, met zijn 50-delige serie over SQL Server Always On Availability Groups. Op basis van zijn bijdrage aan de SQL Server gemeenschap is hij erkend met diverse prijzen, waaronder de prestigieuze “Beste auteur van het jaar” continu in 2020 en 2021 bij SQLShack.
Raj is altijd geïnteresseerd in nieuwe uitdagingen, dus als u consulting hulp nodig heeft over een onderwerp dat in zijn geschriften aan de orde komt, kunt u hem bereiken op [email protected]
Bekijk alle berichten van Rajendra Gupta
Laatste berichten van Rajendra Gupta (zie alle)
- Uitvoeren van kleine en grote versie-upgrades voor AWS RDS SQL Server –
29 januari, 2021