Vérifiez si la table existe dans SQL Server

voix
858

Je voudrais que ce soit la dernière discussion sur la façon de vérifier si une table existe dans SQL Server 2000/2005 en utilisant l'instruction SQL.

Lorsque vous Google pour la réponse, vous obtenez tant de réponses différentes. Est-il un moyen officiel / compatibilité ascendante et descendante de le faire?

Voici deux façons 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 moyen:

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

MySQL fournit simple

SHOW TABLES LIKE '%tablename%'; 

déclaration. Je cherche quelque chose de similaire.

Créé 03/10/2008 à 17:00
source utilisateur
Dans d'autres langues...                            


26 réponses

voix
1k

Pour des questions comme celle - ci , il est toujours préférable d'utiliser une INFORMATION_SCHEMAvue. Ces vues sont ( la plupart du temps) standard à travers de nombreuses bases de données différentes et changent rarement d' une version à.

Pour vérifier si une table existe utilisation:

IF (EXISTS (SELECT * 
                 FROM INFORMATION_SCHEMA.TABLES 
                 WHERE TABLE_SCHEMA = 'TheSchema' 
                 AND  TABLE_NAME = 'TheTable'))
BEGIN
    --Do Stuff
END
Créé 03/10/2008 à 17:17
source utilisateur

voix
221

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
Créé 28/01/2010 à 15:50
source utilisateur

voix
179

Nous utilisons toujours le OBJECT_IDstyle pour aussi longtemps que je me souvienne

IF OBJECT_ID('*objectName*', 'U') IS NOT NULL 
Créé 03/10/2008 à 17:05
source utilisateur

voix
77

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 un tableau clients existe dans la base de données actuelle.

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 un tableau clients existe dans la base de données actuelle.

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

Approche 3: Utilisation de sys.objects Catalogue Voir

Nous pouvons utiliser la vue catalogue sys.objects pour vérifier l'existence du tableau 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 Catalogue Voir

Nous pouvons utiliser la vue catalogue sys.tables pour vérifier l'existence du tableau 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 table système

Nous devons éviter d'utiliser le tableau du système de sys.sysobjects directement, accès direct, il sera dépréciée dans certaines versions futures du Sql Server. Comme par lien Microsoft BOL, Microsoft suggère d'utiliser les vues catalogue sys.objects / 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

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

Créé 22/12/2014 à 12:01
source utilisateur

voix
27

Vous recherchez une table sur une autre base de données:

if exists (select * from MyOtherDatabase.sys.tables where name = 'MyTable')
    print 'Exists'
Créé 15/03/2012 à 18:19
source utilisateur

voix
19
IF OBJECT_ID('mytablename') IS NOT NULL 
Créé 22/11/2013 à 10:59
source utilisateur

voix
17

Je voulais juste mentionner une situation où il serait sans doute un peu plus facile à utiliser la OBJECT_IDméthode. Les INFORMATION_SCHEMAvues sont des objets sous chaque database-

Les vues du 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

Par conséquent toutes les tables que vous accès à l'aide

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 fera que refléter ce qui est [database]. Si vous voulez vérifier si les tables dans une autre base de données existent, sans changer de façon dynamique la [database]chaque fois, OBJECT_IDvous 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 Edition :

A partir de 2016, Microsoft a simplifié la possibilité de vérifier des objets inexistants avant l' abandon, en ajoutant les if existsmots - clés pour les dropdéclarations. Par exemple,

drop table if exists mytablename

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

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

Créé 22/06/2016 à 17:18
source utilisateur

voix
17

En utilisant le schéma d'information est la façon standard SQL pour le faire, il devrait donc être utilisé par toutes les bases de données qui prennent en charge.

Créé 03/10/2008 à 17:03
source utilisateur

voix
10
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.

Créé 07/04/2011 à 11:39
source utilisateur

voix
8

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
Créé 21/01/2011 à 16:37
source utilisateur

voix
8

Si vous avez besoin de travailler sur différentes bases de données:

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
Créé 21/10/2009 à 15:58
source utilisateur

voix
5

Il suffit d'ajouter ici, pour le bénéfice des développeurs et autres DBAs

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

(Qui peut ou non contenir le schemaname) et renvoie les informations ci-dessous si l'schema.table existe:

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

Je produisais ce script pour être utilisé à l'intérieur d'autres scripts chaque fois que je dois vérifier si l'existence ou non d'une table ou une vue, et quand il le fait, obtenir son object_id à être utilisé à d'autres fins.

Il soulève une erreur lorsque l'vous avez passé une chaîne vide, un mauvais nom de schéma ou le nom de mauvaise table.

cela pourrait être dans une procédure et retour -1 par exemple.

À titre d'exemple, j'ai une table appelée « Facts.FactBackOrder » dans l'une de mes bases de données de l'entrepôt de données.

Voici comment j'ai réalisé 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 IGNORE  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 
Créé 23/01/2015 à 17:40
source utilisateur

voix
4

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
Créé 16/04/2015 à 13:42
source utilisateur

voix
3
    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
Créé 18/11/2014 à 14:36
source utilisateur

voix
3
IF EXISTS 
(
    SELECT  * 

    FROM    INFORMATION_SCHEMA.TABLES 

    WHERE   TABLE_SCHEMA = 'PutSchemaHere'     
            AND  
            TABLE_NAME   = 'PutTableNameHere'
)
Créé 24/10/2013 à 12:04
source utilisateur

voix
2

Quelque chose d' important à savoir pour tout le monde qui n'a pas trouvé sa solution encore: ! SQL server = MYSQL . Si vous voulez le faire avec MYSQL , il 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";

L'affichage de cette ici parce qu'il est haut frappé à Google.

Créé 23/07/2014 à 14:55
source utilisateur

voix
1
select name from SysObjects where xType='U' and name like '%xxx%' order by name
Créé 10/02/2014 à 19:54
source utilisateur

voix
0

Vous pouvez utiliser le code ci-dessous

IF (OBJECT_ID('TableName') IS NOT NULL )
BEGIN
  PRINT 'Table Exists'
END
ELSE
BEGIN 
  PRINT 'Table NOT Exists'
END

Ou

IF (EXISTS (SELECT * FROM sys.tables WHERE NAME = 't33Order'))
BEGIN
  PRINT 'Table Exists'
END
ELSE
BEGIN 
  PRINT 'Table NOT Exists'
END
Créé 15/09/2019 à 08:47
source utilisateur

voix
0
IF EXISTS (
SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE 
TABLE_CATALOG = 'Database Name' and
TABLE_NAME = 'Table Name' and 
TABLE_SCHEMA = 'Schema Name') -- Database and Schema name in where statement can be deleted

BEGIN
--TABLE EXISTS
END

ELSE BEGIN
--TABLE DOES NOT EXISTS
END
Créé 03/07/2019 à 13:03
source utilisateur

voix
0

Exécutez cette requête pour vérifier si la table existe dans la base de données:

IF(SELECT TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'YourTableName') IS NOT NULL
PRINT 'Table Exists';
Créé 29/05/2019 à 16:38
source utilisateur

voix
0

J'ai eu quelques problèmes, soit avec la sélection de INFORMATIONAL_SCHEME et OBJECT_ID. Je ne sais pas si c'est un problème de pilote ODBC ou quelque chose .. Les requêtes du studio de gestion SQL, les deux, étaient d'accord.

Voici la solution:

SELECT COUNT(*) FROM <yourTableNameHere>

Donc, si la requête échoue, il est, sans doute, pas de table dans la base de données (ou que vous ne disposez pas des autorisations d'accès).

La vérification est effectuée en comparant la valeur (entier dans mon cas) retourné par l'exécuteur SQL qui traite pilote ODBC ..

if (sqlexec(conectionHandle, 'SELECT COUNT(*) FROM myTable') == -1) {
  // myTable doesn't exist..
}
Créé 22/03/2019 à 08:31
source utilisateur

voix
0
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
Créé 19/06/2018 à 08:54
source utilisateur

voix
0

- - créer la 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 les migrations de table existe


 CALL checkIfTableExists('muDbName', 'migrations', @output);
Créé 06/09/2017 à 09:39
source utilisateur

voix
0

Si cela doit être la discussion « ultime », il convient de noter que le scénario de Larry Leonard peut interroger un serveur distant et si les serveurs sont liés.

if exists (select * from REMOTE_SERVER.MyOtherDatabase.sys.tables where name = 'MyTable')
    print 'Exists'
Créé 18/08/2014 à 23:08
source utilisateur

voix
0

Si quelqu'un essaie de faire la même chose dans LINQ to SQL (ou en particulier LINQPad) activer l'option d'inclure les tables système et des vues et faire 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 élément et le schéma dans une propriété appelée schéma où la source est nom de la variable a

Créé 07/02/2014 à 19:48
source utilisateur

voix
-5

considérer dans une base de données que vous avez une table t1. vous voulez exécuter le script sur d'autres bases de données comme - si t1 existent alors ne font rien d'autre à créer t1. Pour ce faire, le studio visuel ouvert et procédez comme suit:

Faites un clic droit sur t1, puis un script de table comme, puis DROP et créer à, puis Nouvelle requête éditeur

vous trouverez votre requête souhaitée. Mais avant d'exécuter ce script ne pas oublier de commenter la déclaration de baisse dans la requête que vous ne voulez pas créer de nouveau s'il y a déjà un.

Merci

Créé 10/04/2013 à 19:32
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more