SQLShack (Français)

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

En tant que formateur certifié MCSA et Microsoft à Gurgaon, Inde, avec 13 ans d’expérience, Rajendra travaille pour une variété de grandes entreprises en se concentrant sur l’optimisation des performances, la surveillance, la haute disponibilité et les stratégies de reprise après sinistre et leur mise en œuvre. Il est l’auteur de centaines d’articles faisant autorité sur SQL Server, Azure, MySQL, Linux, Power BI, l’optimisation des performances, AWS/Amazon RDS, Git et les technologies connexes, qui ont été consultés par plus de 10 millions de lecteurs à ce jour.
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

Latest posts by Rajendra Gupta (see all)
  • 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

.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *