Pregunta Compruebe si existe tabla en SQL Server


Me gustaría que esta sea la discusión final sobre cómo verificar si existe una tabla en SQL Server 2000/2005 usando SQL Statement.

Cuando busca la respuesta de Google, obtiene tantas respuestas diferentes. ¿Hay una manera oficial / retroactiva y compatible de hacerlo?

Aquí hay dos formas posibles de hacerlo. ¿Cuál de los dos es la mejor forma de hacerlo?

Primera forma:

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;

Segunda forma:

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

MySQL proporciona el simple

SHOW TABLES LIKE '%tablename%'; 

declaración. Estoy buscando algo similar.


878
2017-10-03 16:00


origen


Respuestas:


Para consultas como esta siempre es mejor usar un INFORMATION_SCHEMA ver. Estas vistas son (principalmente) estándar en muchas bases de datos diferentes y rara vez cambian de una versión a otra.

Para verificar si existe una tabla, use:

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



También tenga en cuenta que si por alguna razón necesita verificar una tabla temporal, puede hacer esto:

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

225
2018-01-28 14:50



Siempre usamos el OBJECT_ID estilo durante el tiempo que recuerdo

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

180
2017-10-03 16:05



Por favor, mira los enfoques a continuación,

Método 1: Uso de la vista INFORMATION_SCHEMA.TABLES

Podemos escribir una consulta como la siguiente para verificar si existe una tabla de clientes en la base de datos actual.

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

Método 2: utilizando la función OBJECT_ID ()

Podemos usar la función OBJECT_ID () como a continuación para verificar si existe una tabla de clientes en la base de datos actual.

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

Método 3: Uso de sys.Objects Catalog View

Podemos usar la vista del catálogo Sys.Objects para verificar la existencia de la tabla como se muestra a continuación:

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

Método 4: Uso de sys.Tables Vista de catálogo

Podemos usar la vista del catálogo Sys.Tables para verificar la existencia de la tabla como se muestra a continuación:

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

Método 5: Evite el uso de la tabla del sistema sys.sysobjects

Deberíamos evitar el uso de sys.sysobjects System Table directamente, el acceso directo al mismo quedará obsoleto en algunas versiones futuras del servidor Sql. Según el enlace Microsoft BOL, Microsoft sugiere utilizar las vistas del catálogo sys.objects / sys.tables en lugar de la tabla del sistema sys.sysobjects directamente.

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

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


85
2017-12-22 12:01



Buscando una tabla en una base de datos diferente:

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



Solo quería mencionar una situación en la que probablemente sería un poco más fácil usar el OBJECT_ID método. los INFORMATION_SCHEMA las vistas son objetos debajo de cada base de datos-

Las vistas del esquema de información se definen en un esquema especial llamado   INFORMATION_SCHEMA. Este esquema está contenido en cada base de datos.

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

Por lo tanto, todas las tablas a las que accede usando

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;

solo reflejará lo que está en [database]. Si desea verificar si las tablas en otro la base de datos existe, sin cambiar dinámicamente el [database] cada vez, OBJECT_ID te permitirá hacer esto de la caja. Ex-

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

funciona tan bien como

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

SQL SERVER 2016 Editar:

A partir de 2016, Microsoft simplificó la capacidad de verificar la existencia de objetos inexistentes antes de su lanzamiento, al agregar if exists palabras clave para dropdeclaraciones. Por ejemplo,

drop table if exists mytablename

hará lo mismo que OBJECT_ID / INFORMATION_SCHEMA envoltorios, en 1 línea de código.

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


18
2018-06-22 17:18



El uso del esquema de información es la manera estándar de SQL para hacerlo, por lo que debe ser utilizado por todas las bases de datos que lo soportan.


17
2017-10-03 16:03