Pregunta

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

Cuando buscas la respuesta en Google, obtienes tantas respuestas diferentes. ¿Hay una forma oficial / compatible con versiones anteriores y posteriores de hacerlo?

Aquí hay dos formas posibles de hacerlo. ¿Cuál de las dos es la mejor forma estándar / 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 vía:

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

MySQL proporciona lo simple

SHOW TABLES LIKE '%tablename%'; 

declaración. Estoy buscando algo similar.

¿Fue útil?

Solución

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

Para verificar si existe una tabla usa:

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

Otros consejos

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

Siempre usamos el estilo OBJECT_ID durante el tiempo que recuerdo

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

Por favor, vea los siguientes enfoques,

Enfoque 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

Enfoque 2: Uso de la función OBJECT_ID ()

Podemos usar la función OBJECT_ID () como se muestra 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

Enfoque 3: Uso de sys. Vista del catálogo de objetos

Podemos usar la vista de 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

Enfoque 4: Uso de la vista de catálogo de tablas sys.

Podemos usar la vista de 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

Enfoque 5: Evite usar la tabla del sistema sys.sysobjects

Debemos evitar el uso de la tabla del sistema sys.sysobjects directamente, ya que el acceso directo a ella quedará obsoleto en algunas versiones futuras del servidor Sql. Según el enlace de Microsoft BOL, Microsoft sugiere usar las vistas de 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

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

Buscando una tabla en una base de datos diferente:

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

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

  

Las vistas del esquema de información se definen en un esquema especial llamado   INFORMACIÓN_SQUEMA. 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 accedes 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 [base de datos] . Si desea comprobar si existen tablas en otra , sin cambiar dinámicamente el [database] cada vez, OBJECT_ID le permitirá hacerlo 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 Edit :

A partir de 2016, Microsoft simplificó la capacidad de verificar objetos inexistentes antes de soltarlos, agregando las palabras clave si existen a las declaraciones de drop . Por ejemplo,

drop table if exists mytablename

hará lo mismo que las envolturas OBJECT_ID / INFORMATION_SCHEMA , 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/

IF OBJECT_ID('mytablename') IS NOT NULL 

El uso del esquema de información es la forma estándar de SQL de hacerlo, por lo que todas las bases de datos que lo admiten deben usarlo.

Si necesita trabajar en diferentes bases de datos:

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

Aquí en el código anterior, el nombre de la tabla es Mapping_APCToFANavigator .

Sé que es una pregunta antigua, pero he encontrado esta posibilidad si planeas llamarla con frecuencia.

create procedure Table_Exists
@tbl varchar(50)
as
return (select count(*) from sysobjects where type = 'U' and name = @tbl)
go

Solo agregando aquí, para beneficio de los desarrolladores y compañeros de DBA

un script que recibe @Tablename como parámetro

(que puede o no puede contener el esquema) y devuelve la información a continuación si existe el esquema.tabla:

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

Produje este script para usarlo dentro de otros scripts cada vez que necesito probar si existe o no una tabla o vista, y cuando exista, obtenga su object_id para otros fines.

Produce un error cuando pasaste una cadena vacía, un nombre de esquema incorrecto o un nombre de tabla incorrecto.

esto podría estar dentro de un procedimiento y devolver -1, por ejemplo.

Como ejemplo, tengo una tabla llamada " Facts.FactBackOrder " en una de mis bases de datos de Data Warehouse.

Así es como lo logré:

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 

En SQL Server 2000 puedes probar:

IF EXISTS(SELECT 1 FROM sysobjects WHERE type = 'U' and name = 'MYTABLENAME')
BEGIN
   SELECT 1 AS 'res' 
END
IF EXISTS 
(
    SELECT  * 

    FROM    INFORMATION_SCHEMA.TABLES 

    WHERE   TABLE_SCHEMA = 'PutSchemaHere'     
            AND  
            TABLE_NAME   = 'PutTableNameHere'
)
    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

Algo importante que se debe saber para cualquiera que aún no haya encontrado su solución: Servidor SQL! = MYSQL . Si quieres hacerlo con MYSQL , es bastante 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";

Publicar esto aquí porque es el principal éxito de Google.

select name from SysObjects where xType='U' and name like '%xxx%' order by name

- - crea un procedimiento para verificar si existe una tabla


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 ;

- - cómo usar: verificar si existen migraciones de tablas


 CALL checkIfTableExists('muDbName', 'migrations', @output);
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

Si alguien está intentando hacer lo mismo en linq to sql (o especialmente en linqpad), active la opción para incluir tablas y vistas del sistema y haga este código:

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

dado que tiene un objeto con el nombre en una propiedad llamada elemento, y el esquema en una propiedad llamada esquema donde el nombre de la variable de origen es a

Si esta es la discusión 'definitiva', se debe tener en cuenta que el script de Larry Leonard puede consultar un servidor remoto también si los servidores están vinculados.

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

He tenido algunos problemas con la selección de INFORMATIONAL_SCHEME y OBJECT_ID. No sé si es un problema del controlador ODBC o algo así. Las consultas del estudio de administración de SQL, ambos, estaban bien.

Aquí está la solución:

SELECT COUNT(*) FROM <yourTableNameHere>

Entonces, si la consulta falla, probablemente no exista tal tabla en la base de datos (o no tiene permisos de acceso a ella).

La comprobación se realiza comparando el valor (entero en mi caso) devuelto por el ejecutor SQL que se ocupa del controlador ODBC ...

if (sqlexec(conectionHandle, 'SELECT COUNT(*) FROM myTable') == -1) {
  // myTable doesn't exist..
}

Ejecute esta consulta para verificar si la tabla existe en la base de datos:

IF(SELECT TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'YourTableName') IS NOT NULL
PRINT 'Table Exists';
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

considera que en una base de datos tienes una tabla t1. desea ejecutar un script en otra base de datos como: si t1 existe, no haga nada más crear t1. Para hacer esto abre el estudio visual y haz lo siguiente:

Haga clic con el botón derecho en t1, luego Script table as, luego DROP y Create To, luego New Query Editor

encontrará la consulta deseada. Pero antes de ejecutar ese script, no olvide comentar la instrucción drop en la consulta, ya que no desea crear una nueva si ya existe una.

Gracias

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top