Question Vérifiez si la table existe dans SQL Server


Je voudrais que ce soit la discussion ultime sur la façon de vérifier si une table existe dans SQL Server 2000/2005 en utilisant SQL Statement.

Lorsque vous répondez à Google, vous obtenez tellement de réponses différentes. Existe-t-il un moyen officiel / rétrograde et avancé de le faire?

Voici deux façons possibles de le faire. Lequel parmi les deux est la norme / meilleure façon de le faire?

Première façon:

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 façon:

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 cherche quelque chose de similaire.


878
2017-10-03 16:00


origine


Réponses:


Pour des requêtes comme celle-ci, il est toujours préférable d'utiliser un INFORMATION_SCHEMA vue. Ces vues sont (la plupart du temps) standard dans de nombreuses bases de données différentes et changent rarement de version en version.

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

1062
2017-10-03 16:17



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

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

225
2018-01-28 14:50



Nous utilisons toujours le OBJECT_ID le style aussi longtemps que je me souviens

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

180
2017-10-03 16:05



S'il vous plaît voir les approches ci-dessous,

Approche 1: Utilisation de la vue INFORMATION_SCHEMA.TABLES

Nous pouvons écrire une requête comme ci-dessous pour vérifier si une table Customers existe dans la base de données en cours.

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'Customers')
BEGIN
    PRINT 'Table Exists'
END

Approche 2: Utilisation de la fonction OBJECT_ID ()

Nous pouvons utiliser la fonction OBJECT_ID () comme ci-dessous pour vérifier si une table Customers existe dans la base de données en cours.

IF OBJECT_ID(N'dbo.Customers', N'U') IS NOT NULL
BEGIN
    PRINT 'Table Exists'
END

Approche 3: Utilisation de la vue de catalogue sys.Objects

Nous pouvons utiliser la vue de catalogue Sys.Objects pour vérifier l'existence de la table comme indiqué ci-dessous:

IF EXISTS(SELECT 1 FROM sys.Objects WHERE  Object_id = OBJECT_ID(N'dbo.Customers') AND Type = N'U')
BEGIN
   PRINT 'Table Exists'
END

Approche 4: Utilisation de sys.Tables Catalog View

Nous pouvons utiliser la vue de catalogue Sys.Tables pour vérifier l'existence de la table comme indiqué ci-dessous:

 IF EXISTS(SELECT 1 FROM sys.Tables WHERE  Name = N'Customers' AND Type = N'U')
 BEGIN
      PRINT 'Table Exists'
 END

Approche 5: Évitez d'utiliser la table système sys.sysobjects

Nous devrions éviter d'utiliser sys.sysobjects System Table directement, l'accès direct sera désapprouvé dans certaines futures versions du serveur Sql. Selon le lien Microsoft BOL, Microsoft suggère d'utiliser les vues de catalogue sys.objects / sys.tables au lieu de la table système sys.sysobjects directement.

  IF EXISTS(SELECT name FROM sys.sysobjects WHERE Name = N'Customers' AND xtype = N'U')
  BEGIN
     PRINT 'Table Exists'
  END

renvoyé de: http://sqlhints.com/2014/04/13/how-to-check-if-a-table-exists-in-sql-server/


85
2017-12-22 12:01



Vous cherchez un tableau sur une base de données différente:

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

28
2018-03-15 17:19



IF OBJECT_ID('mytablename') IS NOT NULL 

19
2017-11-22 09:59



Je voulais juste mentionner une situation où il serait probablement un peu plus facile d'utiliser le OBJECT_ID méthode. le INFORMATION_SCHEMA les vues sont des objets sous chaque base de données

Les vues du schéma d'informations sont définies dans un schéma spécial nommé   INFORMATION_SCHEMA. Ce schéma est contenu dans chaque base de données.

https://msdn.microsoft.com/en-us/library/ms186778.aspx

Par conséquent, toutes les tables auxquelles vous accédez en utilisant

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

ne reflétera que ce qui est en [database]. Si vous voulez vérifier si les tables dans un autre base de données existe, sans changer dynamiquement la [database] chaque fois, OBJECT_ID vous permettra de le faire hors de la boîte. Ex-

IF OBJECT_ID (N'db1.schema.table1', N'U') IS NOT NULL 
   SELECT 1 AS res ELSE SELECT 0 AS res;

fonctionne aussi bien que

IF OBJECT_ID (N'db2.schema.table1', N'U') IS NOT NULL 
   SELECT 1 AS res ELSE SELECT 0 AS res;

SQL SERVER 2016 Modifier:

À partir de 2016, Microsoft a simplifié la possibilité de rechercher des objets inexistants avant de les supprimer, en ajoutant if exists mots-clés à dropdéclarations. Par exemple,

drop table if exists mytablename

fera la même chose que OBJECT_ID / INFORMATION_SCHEMA wrappers, dans 1 ligne de code.

https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/03/drop-if-exists-new-thing-in-sql-server-2016/


18
2018-06-22 17:18



L'utilisation du schéma d'informations est la manière standard de le faire, il devrait donc être utilisé par toutes les bases de données qui le supportent.


17
2017-10-03 16:03



IF EXISTS 
(
    SELECT   * 
    FROM     sys.objects 
    WHERE    object_id = OBJECT_ID(N'[dbo].[Mapping_APCToFANavigator]') 
             AND 
             type in (N'U')
)
BEGIN

    -- Do whatever you need to here.

END

Ici, dans le code ci-dessus, le nom de la table est Mapping_APCToFANavigator.


10
2018-04-07 10:39