Cet article parcourt les différentes versions de l’instruction T-SQL IF EXISTS pour la base de données SQL à l’aide de divers exemples.
- IF EXISTS dans SQL 2014 ou avant
- DROP ..IF EXISTS dans SQL Server 2016 à SQL Server 2019
Introduction
Supposons que vous souhaitiez déployer des objets tels que des tables, des procédures, des fonctions dans la base de données SQL Server. Si vous exécutez des instructions CREATE pour ces objets, et que cet objet existe déjà dans une base de données, vous obtenez le message 2714, niveau 16, état 3 du message d’erreur comme indiqué ci-dessous.
Vous pouvez écrire une instruction DROP avant d’exécuter l’instruction create. Cela fonctionne bien si l’objet existe dans la base de données.
Dans le cas où l’objet n’existe pas, et que vous essayez de le déposer, vous obtenez l’erreur suivante.
Pour éviter cette situation, généralement, les développeurs ajoutent une instruction T-SQL If Exists et déposent l’objet s’il est déjà disponible dans la base de données.
Disons que nous souhaitons déployer une procédure stockée ‘stpGetAllMembers’ dans la base de données de test SQLShack. Nous pouvons utiliser plusieurs méthodes pour vérifier l’existence de la procédure dans la base de données SQL mais interrogeons la table système sys.objects pour la trouver.
Le code suivant fait les choses ci-dessous pour nous :
- D’abord, il exécute l’instruction select à l’intérieur de l’instruction IF Exists
- Si l’instruction select renvoie une valeur que la condition est VRAIE pour IF Exists
- Il lance le code à l’intérieur d’une instruction begin et imprime le message
Si la procédure n’existe pas, elle n’exécute pas le code dans une instruction begin.
Maintenant, nous voulons abandonner cette procédure si elle existe déjà dans la base de données. Nous pouvons ajouter une commande DROP PROCEDURE à l’intérieur d’une instruction begin. Elle abandonne la procédure stockée si elle existe déjà dans la base de données.
Nous pouvons également utiliser cette méthode avec d’autres objets du serveur SQL. La requête suivante vérifie l’existence de la table SQL et la supprime si elle est présente.
Dans l’article, Snippets de code SQL dans Azure Data Studio, nous avons abordé les snippets de code pour l’écriture T-SQL. J’ai pensé à vérifier la syntaxe du snippet sqlCreateStoredProc pour une nouvelle procédure stockée.
Pour afficher la définition de ce snippet, tapez create proc, appuyez sur le sqlCreateStoredProc et entrez.
Comme le montre l’image suivante, ce snippet utilise également la méthode IF EXISTS pour écrire une procédure stockée.
L’instruction DROP IF EXISTS
SQL Server 2016 fournit une amélioration pour vérifier l’existence de l’objet et le déposer s’il existe déjà. Il introduit la commande DROP IF EXISTS à cette fin.
La syntaxe de DROP IF EXISTS
DROP OBJECT_TYPE OBJECT_NAME
- Il laisse tomber l’objet s’il existe déjà dans la base de données SQL
- On peut aussi l’utiliser pour laisser tomber la colonne ou les contraintes également
- Si l’objet spécifié n’existe pas, il ne donne pas de message d’erreur. Il continue l’exécution pour la commande suivante
Nous pouvons utiliser la base de données, la table, la fonction, le déclencheur, la procédure stockée, la colonne, l’utilisateur, la vue, le schéma, l’index, le rôle pour cette commande.
Comprenons cette nouvelle clause T-SQL IF EXISTS à l’aide de différents exemples.
DROP Stored Procedure IF EXISTS
Dans l’exemple précédent, nous avons utilisé DROP Stored Procedure stpGetAllMembers à des fins de démonstration. Cette procédure stockée n’existe pas maintenant. Utilisons la nouvelle méthode et essayons de déposer la procédure stockée.
1
|
DROP PROCEDURE IF EXISTS stpGetAllMembers ;
|
Nous pouvons ajouter d’autres codes comme des instructions print, des instructions create. Le code suivant imprime un message après la commande DROP PROCEDURE.
…
1
2
|
.
DROP PROCEDURE IF EXISTS stpGetAllMembers
PRINT ‘Stored proc does not exist’
|
Créons la procédure stockée en utilisant cette nouvelle syntaxe T-.SQL IF EXISTS. La requête suivante dépose la procédure stockée si elle existe déjà, dans le cas où elle n’existe pas, elle en créera une.
1
2
3
. 4
5
6
7
8
9
|
DUP 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
Nous pouvons utiliser la requête suivante pour SQL 2016 ou une version ultérieure pour abandonner une vue.
1
2
|
.
. DROP VIEW IF EXISTS vwABC
GO
|
En SQL Server 2014 ou version antérieure, on utilise le code suivant. Il vérifie les vues en utilisant sys.objects pour le type V.
1
2
3
4
|
IF EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N’vwABC’)
ET type = N’V’)
DROP VIEW vwABC
GO
|
.
DROP Constraint IF EXISTS
Nous pouvons utiliser la commande suivante pour abandonner une contrainte UNIQUE à l’aide de l’instruction DROP CONSTRAINT IF EXISTS.
1
2
|
.
ALTER TABLE DemoTable DROP CONSTRAINT IF EXISTS EmpID
GO
|
Le code suivant fonctionne dans SQL 2014 ou avant. Le type UQ dans le sys.objects fait référence à une contrainte UNIQUE.
Pour une contrainte de contrôle, changez le type de UQ à C dans la requête de la version SQL 2014 ou antérieure. Nous n’avons pas besoin de modifier la requête spécifiée à l’aide de l’instruction DROP CONSTRAINT IF EXISTS.
DROP Table IF EXISTS
Nous pouvons utiliser l’instruction DROP TABLE IF EXISTS pour déposer une table SQL également dans SQL Server 2016 ou une version ultérieure.
1
2
|
DROP TABLE IF EXISTS DemoTable
GO
|
Pour SQL 2014 ou les versions précédentes, nous devons utiliser la méthode IF EXISTS comme indiqué ci-dessous. Le type U fait référence à une table SQL définie par l’utilisateur.
1
2
3
4
|
IF EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N’DemoTable’)
ET type = N’U’)
DROP TABLE DemoTable
GO
|
DROP Database IF EXISTS
Nous pouvons utiliser les nouveaux scripts T-.SQL If Exists scripts pour abandonner une base de données SQL également pour SQL 2016 ou une version ultérieure.
1
2
|
DROP DATABASE IF EXISTS TargetDB
GO
|
Au lieu de cela, utilisez le script suivant avec SQL 2014 ou une version inférieure. Il est également valable dans les versions supérieures de SQL Server.
1
2
3
|
IF EXISTS (SELECT 1 FROM sys.databases WHERE database_id = DB_ID(N’TargetDB’))
DUP DATABASE TargetDB
GO
|
DROP Column IF EXISTS
Parfois nous avons besoin de déposer une colonne d’une table SQL. C’est une bonne pratique également de laisser tomber les colonnes non désirées. Cela permet d’économiser des efforts pour le moteur SQL et d’améliorer les performances de la requête tout en récupérant moins d’enregistrements pour la sortie.
Nous déposons une colonne en utilisant l’instruction Alter Table. Nous pouvons également tirer parti de DROP COLUMN IF EXISTS dans cette instruction alter. Supposons que nous voulions supprimer une colonne Pays de la table Employés. Nous utilisons l’instruction alter table suivante.
1
2
|
ALTER TABLE Employee DROP COLUMN IF EXISTS Country
GO
|
C’est une seule ligne et une requête simple. Alternativement, nous utilisons la requête suivante en utilisant IF Exists. Elle semble être plus compliquée que la précédente. Nous devrions utiliser la dernière syntaxe de requête avec les versions de SQL Server prises en charge.
Conclusion
Dans cet article, nous avons exploré deux versions différentes des instructions IF Exists de T-SQL.
- IF EXISTS dans SQL 2014 ou avant
- DROP IF EXISTS dans SQL Server 2016 ou après
Vous devriez choisir la syntaxe qui vous convient. Je vous recommande la plus récente (Drop [object[ IF Exists), si vous êtes sur SQL 2016 ou des versions ultérieures.
- Auteur
- Postages récents
Il est le créateur de l’une des plus grandes collections gratuites d’articles en ligne sur un seul sujet, avec sa série de 50 articles sur les groupes de disponibilité Always On de SQL Server. Sur la base de sa contribution à la communauté SQL Server, il a été récompensé par divers prix, notamment le prestigieux « Meilleur auteur de l’année » de manière continue en 2020 et 2021 à SQLShack.
Raj est toujours intéressé par de nouveaux défis, donc si vous avez besoin d’aide de consultation sur n’importe quel sujet couvert dans ses écrits, il peut être joint à l’adresse [email protected]
Voir tous les messages de Rajendra Gupta
- Exécution de mises à jour de versions mineures et majeures pour AWS RDS SQL Server -. 29 janvier, 2021
- Déploiement des instances AWS RDS PostgreSQL – 27 janvier 2021
- Migration de vos bases de données SQL sur site vers AWS RDS SQL Server à l’aide d’AWS DMS – 25 janvier 2021
.