exist drop sql-server tsql sql-server-2005 sql-server-2000

sql-server - drop - if exist temporary table sql server



Compruebe si la tabla existe en SQL Server (22)

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

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

Cuando buscas la respuesta en Google, obtienes tantas respuestas diferentes. ¿Hay una forma de hacerlo oficial / hacia atrás y hacia adelante compatible?

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

SHOW TABLES LIKE ''%tablename%'';

declaración. Estoy buscando algo similar.


- - crear procedimiento para comprobar 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 utilizar: comprobar si existen migraciones de tablas

CALL checkIfTableExists(''muDbName'', ''migrations'', @output);


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 top hit en Google.


Buscando una tabla en una base de datos diferente:

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


Considerar 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 derecho en t1, luego Script table as, luego DROP y Create To, luego New Query Editor

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

Gracias


En SQL Server 2000 puedes probar:

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


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


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 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 la vista de catálogo sys.Objects

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

Enfoque 4: Uso de sys.Tables Catalog View

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

Enfoque 5: evitar el uso de la tabla del sistema sys.sysobjects

Debemos evitar el uso de sys.sysobjects System Table directamente, ya que el acceso directo a la misma quedará obsoleto en algunas versiones futuras del servidor SQL. Según el enlace de Microsoft BOL, Microsoft sugiere utilizar 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 de: http://sqlhints.com/2014/04/13/how-to-check-if-a-table-exists-in-sql-server/


Sé que es una pregunta antigua, pero he encontrado esta posibilidad si planea llamarla a menudo.

create procedure Table_Exists @tbl varchar(50) as return (select count(*) from sysobjects where type = ''U'' and name = @tbl) 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 también puede consultar un servidor remoto si los servidores están vinculados.

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


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


Siempre usamos el estilo OBJECT_ID durante el tiempo que recuerdo

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


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 contener el nombre de 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 esta secuencia de comandos para usarla dentro de otras secuencias de comandos cada vez que necesito probar si existe o no una tabla o vista, y cuando lo hace, obtener su object_id para ser usado para otros fines.

Produce un error cuando se pasa 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 logré esto:

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


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 denominado 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 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 [database] . Si desea comprobar si existen tablas en otra base de datos, sin cambiar dinámicamente la [database] cada vez, OBJECT_ID le permitirá hacer esto de manera OBJECT_ID . 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 if exists para drop declaraciones. 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/


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


Usar el esquema de información es la manera estándar de hacerlo, por lo que debe ser utilizado por todas las bases de datos que lo admiten.


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 .


IF EXISTS ( SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = ''PutSchemaHere'' AND TABLE_NAME = ''PutTableNameHere'' )


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


IF OBJECT_ID(''mytablename'') IS NOT NULL


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