1261 votes

Vérifier si la table existe dans le serveur SQL

J'aimerais que ce soit la discussion ultime sur la façon de vérifier si une table existe dans SQL Server 2000/2005 en utilisant des instructions SQL.

Lorsque vous cherchez la réponse sur Google, vous obtenez tellement de réponses différentes. Existe-t-il une manière officielle/rétroactive et compatible avec le futur de le faire ?

Voici deux façons possibles de le faire. Laquelle de ces deux façons est la plus standard/la meilleure ?

Premier moyen :

IF EXISTS (SELECT 1 
           FROM INFORMATION_SCHEMA.TABLES 
           WHERE TABLE_TYPE='BASE TABLE' 
           AND TABLE_NAME='mytablename') 
   SELECT 1 AS res ELSE SELECT 0 AS res;

Deuxième voie :

IF OBJECT_ID (N'mytablename', N'U') IS NOT NULL 
   SELECT 1 AS res ELSE SELECT 0 AS res;

MySQL fournit le simple

SHOW TABLES LIKE '%tablename%'; 

déclaration. Je suis à la recherche de quelque chose de similaire.

2 votes

Pourquoi est-il préférable d'utiliser INFORMATION_SCHEMA.TABLES au lieu de sys.tables puis de filtrer avec le nom et éventuellement d'ajouter une vérification de la valeur de type_desc ?

1454voto

akmad Points 7059

Pour les requêtes de ce type, il est toujours préférable d'utiliser un fichier de type INFORMATION_SCHEMA vue. Ces vues sont (pour la plupart) standard dans de nombreuses bases de données différentes et changent rarement d'une version à l'autre.

Pour vérifier si une table existe, utilisez :

IF (EXISTS (SELECT * 
                 FROM INFORMATION_SCHEMA.TABLES 
                 WHERE TABLE_SCHEMA = 'TheSchema' 
                 AND  TABLE_NAME = 'TheTable'))
BEGIN
    --Do Stuff
END

1 votes

Comment éviter d'avoir le nom_schéma dans la clause where ? L'avantage d'utiliser l'approche object_id() est qu'elle utilise par défaut le schéma actuel.

11 votes

Étant donné que l'unicité d'un nom d'objet seul (c'est-à-dire sans schéma) n'est pas garantie, il n'existe pas de méthode sûre à 100 %. Si vous travaillez avec une base de données qui n'a pas de conflits de noms entre les schémas, il suffit d'omettre "TABLE_SCHEMA = 'TheSchema'".

32 votes

Pour vérifier la présence d'une table temporaire, nous devons interroger la base de données tempdb et utiliser un opérateur LIKE pour le nom de la table. SELECT * FROM tempdb.INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'TheSchema' AND TABLE_NAME LIKE '#TheTable%'

315voto

jbloomer Points 2000

Notez également que si, pour une raison quelconque, vous devez vérifier la présence d'une table temporaire, vous pouvez le faire :

if OBJECT_ID('tempdb..#test') is not null
 --- temp table exists

14 votes

L'utilisation de cette méthode semble respecter la nature par connexion des tables temporaires. La requête INFORMATION_SCHEMA publiée précédemment renverra des lignes, quelle que soit la connexion qui a créé la table.

269voto

Bob King Points 12913

Nous utilisons toujours le OBJECT_ID d'aussi loin que je me souvienne

IF OBJECT_ID('*objectName*', 'U') IS NOT NULL

18 votes

Je pense que cela serait rapide, mais pas très portable. Les vues du schéma d'information sont garanties d'exister sur tout SGRD qui supporte la norme. De plus, le simple OBJECT_ID ne garantit pas que l'objet est une table.

10 votes

Merci Joe, je me demandais pourquoi vous utilisiez OBJECT_ID plutôt que INFORMATION_SCHEMA.TABLES plutôt que sys.tables. Le fait de souligner que INFORMATION_SCHEMA fait partie d'une norme répond à peu près à cette question. D'ailleurs, c'est drôle, l'un de nos experts en bases de données à qui j'allais poser cette question a le même nom de famille que vous, ce doit être un bon nom de famille pour les bases de données.

26 votes

@JoePineda : Dans ce cas, vous utilisez OBJECT_ID('TableName', 'U') pour garantir que l'objet est une table.

38voto

Larry Leonard Points 111

Je cherche une table dans une autre base de données :

if exists (select * from MyOtherDatabase.sys.tables where name = 'MyTable')
    print 'Exists'

12voto

Vinko Vrsalovic Points 116138

L'utilisation du schéma d'information est la façon standard SQL de le faire, il devrait donc être utilisé par toutes les bases de données qui le supportent.

19 votes

Cela aurait dû être un commentaire.

3 votes

Cette réponse doit être améliorée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X