SQLShack

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
Als MCSA gecertificeerd en Microsoft Certified Trainer in Gurgaon, India, met 13 jaar ervaring, werkt Rajendra voor verschillende grote bedrijven die zich richten op performance optimalisatie, monitoring, hoge beschikbaarheid en disaster recovery strategieën en implementatie. Hij is de auteur van honderden gezaghebbende artikelen over SQL Server, Azure, MySQL, Linux, Power BI, Performance tuning, AWS/Amazon RDS, Git, en aanverwante technologieën die zijn bekeken door meer dan 10 miljoen lezers tot op heden.
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

  • Het implementeren van AWS RDS PostgreSQL instances – 27 januari 2021
  • Het migreren van uw on-premises SQL databases naar AWS RDS SQL Server met behulp van AWS DMS – 25 januari 2021
  • Geef een reactie

    Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *