Vérifier 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 la déclaration SQL.

lorsque vous cherchez la réponse sur Google, vous obtenez tellement de réponses différentes. Officielle/compatibilité ascendante et descendante moyen de le faire?

Voici deux façons de le faire. Lequel parmi les deux est la norme/le meilleur moyen de le faire?

Première manière:

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 manière:

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.

904
demandé sur DrHouseofSQL 2008-10-03 20:00:33

22 réponses

pour des requêtes comme celle-ci, il est toujours préférable d'utiliser une vue INFORMATION_SCHEMA . 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 utiliser:

IF (EXISTS (SELECT * 
                 FROM INFORMATION_SCHEMA.TABLES 
                 WHERE TABLE_SCHEMA = 'TheSchema' 
                 AND  TABLE_NAME = 'TheTable'))
BEGIN
    --Do Stuff
END
1086
répondu akmad 2012-05-03 10:26:39

notez Également que si pour une raison quelconque, vous devez vérifier pour une table temporaire, vous pouvez faire ceci:

if OBJECT_ID('tempdb..#test') is not null
 --- temp table exists
228
répondu James Bloomer 2010-01-28 14:50:03

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

IF OBJECT_ID('*objectName*', 'U') IS NOT NULL 
186
répondu Bob King 2015-06-15 12:44:15

s'il vous Plaît voir ci-dessous, les approches, les

Approach 1: Using INFORMATION_SCHEMA.TABLES view

nous pouvons écrire une requête comme ci-dessous pour vérifier si une Table Clients existe dans la base de données courante.

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 Client existe dans la table courante la base de données.

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

Approche 3: à l'Aide de sys.Catalogue D'Objets Vue

on peut utiliser le Sys.Vue de catalogue d'objets pour vérifier l'existence de la Table comme montré 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: à l'Aide de sys.Les Tableaux D'Affichage Catalogue

on peut utiliser le Sys.Vue de catalogue de tableaux 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 sys.sysobjects Système de de table

Nous devrions éviter d'utiliser sys.sysobjects Table Système directement, l'accès direct à elle sera déprécié dans certaines versions futures du serveur Sql. Comme Microsoft BOL link, Microsoft suggère d'utiliser le catalogue views sys.objets/sys.tables au lieu de sys.sysobjects table système directement.

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

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

92
répondu BrainCoder 2014-12-22 12:01:58

recherche d'une table sur une base de données différente:

if exists (select * from MyOtherDatabase.sys.tables where name = 'MyTable')
    print 'Exists'
30
répondu Larry Leonard 2012-03-15 17:19:42
IF OBJECT_ID('mytablename') IS NOT NULL 
19
répondu sansalk 2015-06-15 12:44:52

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

les vues de schéma d'information 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

donc 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;

reflétera seulement ce qui est dans [database] . Si vous voulez vérifier si les tables dans une autre base de données existent, sans changer dynamiquement le [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 vérifier les objets inexistants avant de les laisser tomber, en ajoutant les mots-clés if exists aux déclarations drop . Par exemple,

drop table if exists mytablename

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

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

18
répondu iliketocode 2017-05-09 15:13:50

utiliser le schéma D'Information est la méthode standard de SQL pour le faire, il doit donc être utilisé par toutes les bases de données qui le supportent.

17
répondu Vinko Vrsalovic 2008-10-03 16:03:54
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

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

10
répondu dilip kumar singh 2014-02-04 17:35:56

si vous devez travailler sur des bases de données différentes:

DECLARE @Catalog VARCHAR(255)
SET @Catalog = 'MyDatabase'

DECLARE @Schema VARCHAR(255)
SET @Schema = 'dbo'

DECLARE @Table VARCHAR(255)
SET @Table = 'MyTable'

IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES   
    WHERE TABLE_CATALOG = @Catalog 
      AND TABLE_SCHEMA = @Schema 
      AND TABLE_NAME = @Table))
BEGIN
   --do stuff
END
8
répondu Even Mien 2009-10-21 14:58:15

je sais que c'est une vieille question, mais j'ai trouvé cette possibilité si vous envisagez d'appeler souvent.

create procedure Table_Exists
@tbl varchar(50)
as
return (select count(*) from sysobjects where type = 'U' and name = @tbl)
go
8
répondu dko 2011-01-21 15:37:37

vient d'ajouter ici, pour le bénéfice des développeurs et des autres DBA

un script qui reçoit @Tablename comme paramètre

(qui peut ou non contenir le nom de schéma) et renvoie les informations ci-dessous si le schéma.table existe:

the_name                object_id   the_schema  the_table       the_type
[Facts].[FactBackOrder] 758293761   Facts       FactBackOrder   Table

j'ai produit ce script pour être utilisé dans d'Autres scripts chaque fois que j'ai besoin de tester si oui ou non une table ou une vue existe, et quand il le fait, obtenir son object_id pour être utilisé pour d'autres fins.

cela génère une erreur lorsque vous avez passé une chaîne vide, un nom de schéma erroné ou un nom de table erroné.

cela pourrait être à l'intérieur d'une procédure et retourner -1 par exemple.

à titre d'exemple, j'ai un tableau intitulé" faits.FactBackOrder" dans une de mes bases de données.

C'est ainsi que j'ai obtenu ceci:

PRINT 'THE SERVER IS ' + @@SERVERNAME
--select db_name()
PRINT 'THE DATABASE IS ' + db_NAME() 
PRINT ''
GO

SET NOCOUNT ON
GO

--===================================================================================
-- @TableName is the parameter
-- the object we want to deal with (it might be an indexed view or a table)
-- the schema might or might not be specified
-- when not specified it is DBO
--===================================================================================

DECLARE @TableName SYSNAME

SELECT @TableName = 'Facts.FactBackOrder'
--===================================================================================
--===================================================================================
DECLARE @Schema SYSNAME
DECLARE @I INT
DECLARE @Z INT 

SELECT @TableName = LTRIM(RTRIM(@TableName))
SELECT @Z = LEN(@TableName)

IF (@Z = 0) BEGIN

            RAISERROR('Invalid @Tablename passed.',16,1)

END 

SELECT @I = CHARINDEX('.',@TableName )
--SELECT @TableName ,@I

IF @I > 0 BEGIN

        --===================================================================================
        -- a schema and table name have been passed
        -- example Facts.FactBackOrder 
        -- @Schema = Fact
        -- @TableName = FactBackOrder
        --===================================================================================

   SELECT @Schema    = SUBSTRING(@TABLENAME,1,@I-1)
   SELECT @TableName = SUBSTRING(@TABLENAME,@I+1,@Z-@I)



END
ELSE BEGIN

        --===================================================================================
        -- just a table name have been passed
        -- so the schema will be dbo
        -- example Orders
        -- @Schema = dbo
        -- @TableName = Orders
        --===================================================================================

   SELECT @Schema    = 'DBO'     


END

        --===================================================================================
        -- Check whether the @SchemaName is valid in the current database
        --===================================================================================

IF NOT EXISTS ( SELECT * FROM INFORMATION_SCHEMA.SCHEMATA K WHERE K.[SCHEMA_NAME] = @Schema ) BEGIN

            RAISERROR('Invalid Schema Name.',16,1)

END 

--SELECT @Schema  as [@Schema]
--      ,@TableName as [@TableName]


DECLARE @R1 TABLE (

   THE_NAME SYSNAME
  ,THE_SCHEMA SYSNAME
  ,THE_TABLE SYSNAME
  ,OBJECT_ID INT
  ,THE_TYPE SYSNAME
  ,PRIMARY KEY CLUSTERED (THE_SCHEMA,THE_NAME)

)

;WITH RADHE_01 AS (
SELECT QUOTENAME(SCHEMA_NAME(O.schema_id)) + '.' + QUOTENAME(O.NAME) AS [the_name]
      ,the_schema=SCHEMA_NAME(O.schema_id)
      ,the_table=O.NAME
      ,object_id =o.object_id 
      ,[the_type]= CASE WHEN O.TYPE = 'U' THEN 'Table' ELSE 'View' END 
from sys.objects O
where O.is_ms_shipped = 0
AND O.TYPE IN ('U','V')
)
INSERT INTO @R1 (
   THE_NAME 
  ,THE_SCHEMA 
  ,THE_TABLE 
  ,OBJECT_ID
  ,THE_TYPE 
)
SELECT  the_name
       ,the_schema
       ,the_table
       ,object_id
       ,the_type
FROM RADHE_01
WHERE the_schema = @Schema 
  AND the_table  = @TableName

IF (@@ROWCOUNT = 0) BEGIN 

             RAISERROR('Invalid Table Name.',16,1)

END 
ELSE BEGIN

    SELECT     THE_NAME 
              ,THE_SCHEMA 
              ,THE_TABLE 
              ,OBJECT_ID
              ,THE_TYPE 

    FROM @R1

END 
5
répondu marcello miorelli 2015-01-23 17:55:50

Dans SQL Server 2000 , vous pouvez essayer:

IF EXISTS(SELECT 1 FROM sysobjects WHERE type = 'U' and name = 'MYTABLENAME')
BEGIN
   SELECT 1 AS 'res' 
END
4
répondu dipi evil 2015-04-16 13:42:06
IF EXISTS 
(
    SELECT  * 

    FROM    INFORMATION_SCHEMA.TABLES 

    WHERE   TABLE_SCHEMA = 'PutSchemaHere'     
            AND  
            TABLE_NAME   = 'PutTableNameHere'
)
3
répondu Moccassin 2014-02-04 17:32:27
    IF OBJECT_ID (N'dbo.T', N'U') IS NOT NULL 
      BEGIN 
          print 'deleted table';
          drop table t 
      END
    else 
      begin 
          print 'table not found' 
      end

Create table t (id int identity(1,1) not null, name varchar(30) not null, lastname varchar(25) null)
insert into t( name, lastname) values('john','doe');
insert into t( name, lastname) values('rose',NULL);

Select * from t
1   john    doe
2   rose    NULL

-- clean
drop table t
3
répondu BTE 2014-11-18 14:36:47

quelque chose d'important à savoir pour quiconque n'a pas encore trouvé sa solution: SQL server != MYSQL . Si vous voulez le faire avec MYSQL , c'est assez simple

    $sql = "SELECT 1 FROM `db_name`.`table_name` LIMIT 1;";
    $result = mysql_query($sql);
    if( $result == false )
        echo "table DOES NOT EXIST";
    else
        echo "table exists";

poster ceci ici parce que c'est le coup le plus fort à Google.

2
répondu Blauhirn 2014-07-23 13:55:00
select name from SysObjects where xType='U' and name like '%xxx%' order by name
1
répondu MarceloMadnezz 2014-02-10 18:54:51

si quelqu'un essaie de faire la même chose dans linq to sql (ou surtout linqpad), activez l'option pour inclure les tables et vues système et faites ce code:

let oSchema = sys.Schemas.FirstOrDefault(s=>s.Name==a.schema )
where oSchema !=null
let o=oSchema!=null?sys.Objects.FirstOrDefault (o => o.Name==a.item && o.Schema_id==oSchema.Schema_id):null
where o!=null

étant donné que vous avez un objet avec le nom dans une propriété appelée item, et le schéma dans une propriété appelée schema où le nom de la variable source est a

0
répondu Maslow 2014-02-07 18:48:06

si cela doit être la discussion "ultime", alors il faut noter que le script de Larry Leonard peut également interroger un serveur distant si les serveurs sont liés.

if exists (select * from REMOTE_SERVER.MyOtherDatabase.sys.tables where name = 'MyTable')
    print 'Exists'
0
répondu user3651072 2014-08-18 22:32:56

-- -- créer une procédure pour vérifier si une table existe


DELIMITER $$

DROP PROCEDURE IF EXISTS `checkIfTableExists`;

CREATE PROCEDURE checkIfTableExists(
    IN databaseName CHAR(255),
    IN tableName CHAR(255),
    OUT boolExistsOrNot CHAR(40)
)

  BEGIN
      SELECT count(*) INTO boolExistsOrNot FROM information_schema.TABLES
      WHERE (TABLE_SCHEMA = databaseName)
      AND (TABLE_NAME = tableName);
  END $$

DELIMITER ;

-- -- comment utiliser : vérifier si la migration des tables existe


 CALL checkIfTableExists('muDbName', 'migrations', @output);
0
répondu Mathieu Dierckx 2017-09-06 09:39:37
IF EXISTS (   SELECT * FROM   dbo.sysobjects WHERE  id = OBJECT_ID(N'dbo.TableName') AND OBJECTPROPERTY(id, N'IsUserTable') = 1 )
BEGIN
  SELECT * FROM dbo.TableName;
END
GO
0
répondu Krishnaraj Barvathaya 2018-06-19 08:54:28

envisager dans une base de données, vous avez un tableau t1. vous voulez lancer script sur une autre base de données comme-si t1 existe alors ne rien faire d'autre pour créer t1. Pour ce faire, ouvrez visual studio et faites ce qui suit:

clic droit sur t1, puis Script table as, puis DROP and Create To, puis New Query Editor""

, vous trouverez votre requête souhaitée. Mais avant d'exécuter ce script n'oubliez pas de commenter l'instruction drop dans la requête que vous ne voulez pas créer un nouveau si il y a déjà un.

Merci

-5
répondu sumon 2013-04-10 18:32:06