Vamos a crear una base de datos de la muestra con una mesa junto a la secuencia de comandos a continuación:
CREATE DATABASE Test
GO
USE Test
GO
CREATE TABLE dbo.tblTest (Id INT, Name NVARCHAR(50))
Enfoque 1: Uso de INFORMATION_SCHEMA.TABLES ver
Podemos escribir una consulta como para comprobar si un tblTest La tabla existe en la base de datos actual.
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'tblTest')
BEGIN
PRINT 'Table Exists'
END
La consulta anterior comprueba la existencia de la tabla tblTest en todos los esquemas de la base de datos actual. En lugar de esto si desea comprobar la existencia de la tabla en un esquema especificado y la base de datos especificada a continuación, podemos escribir la consulta anterior de la siguiente manera:
IF EXISTS (SELECT * FROM Test.INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = N'dbo' AND TABLE_NAME = N'tblTest')
BEGIN
PRINT 'Table Exists'
END
ventajas de este enfoque: vistas INFORMATION_SCHEMA son portátiles a través de diferentes RDBMS sistemas, por lo que la migración a diferentes RDBMS no requiere ningún cambio.
Enfoque 2: Usando la función OBJECT_ID()
Podemos utilizar OBJECT_ID()
función, como a continuación para comprobar si una tabla tblTest existe en la base de datos actual.
IF OBJECT_ID(N'dbo.tblTest', N'U') IS NOT NULL
BEGIN
PRINT 'Table Exists'
END
La especificación del nombre de la base de datos y las partes del nombre del esquema para el nombre de la tabla es opcional. Pero al especificar el Nombre de la base de datos y el Nombre del esquema se proporciona una opción para verificar la existencia de la tabla en la base de datos especificada y dentro de un esquema específico, en lugar de verificar la base de datos actual en todos los esquemas. La consulta siguiente muestra que, aunque la base de datos actual es MASTER, podemos verificar la existencia de la tabla tblTest
en el esquema dbo
en la base de datos Test
.
USE MASTER
GO
IF OBJECT_ID(N'Test.dbo.tblTest', N'U') IS NOT NULL
BEGIN
PRINT 'Table Exists'
END
Pros: Fácil de recordar. Otro punto notable para mencionar sobre la función OBJECT_ID()
es: proporciona una opción para verificar la existencia de la Tabla temporal que se crea en el contexto de conexión actual. Todos los demás enfoques verifican la existencia de la tabla temporal creada en todo el contexto de las conexiones en lugar de solo el contexto de conexión actual. A continuación consulta muestra cómo comprobar la existencia de una tabla temporal utilizando OBJECT_ID()
función:
CREATE TABLE #TempTable(ID INT)
GO
IF OBJECT_ID(N'TempDB.dbo.#TempTable', N'U') IS NOT NULL
BEGIN
PRINT 'Table Exists'
END
GO
Enfoque 3: Uso de sys.objects Catálogo Ver
podemos usar la vista Sys.Objects
catálogo para comprobar 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.tblTest') AND Type = N'U')
BEGIN
PRINT 'Table Exists'
END
Enfoque 4: Uso sys.tables Catálogo Ver
Podemos utilizar la vista Sys.Tables
catálogo para comprobar la existencia de la mesa como se muestra a continuación:
IF EXISTS(SELECT 1 FROM sys.Tables WHERE Name = N'tblTest' AND Type = N'U')
BEGIN
PRINT 'Table Exists'
END
Sys.Tables
vista de catálogo hereda las filas de la vista Sys.Objects
catálogo, Sys.objects
vista de catálogo se conoce como vista base donde como sys.Tables
se conoce como vista derivada. Sys.Tables
devolverá las filas sólo para los objetos de tabla, mientras que Sys.Object
vista aparte de la devolución de las filas de objetos de tabla, devuelve filas de los objetos como: procedimientos almacenados, vistas, etc.
Enfoque 5: evitar el uso de Sistema sys.sysobjects tabla
Debemos evitar el uso de sys.sysobjects
Tabla de sistema directamente, el acceso directo a él quedará obsoleto en algunas versiones futuras del servidor Sql. Según el enlace [Microsoft BOL] [1], 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'tblTest' AND xtype = N'U')
BEGIN
PRINT 'Table Exists'
END
Referencia: http://sqlhints.com/2014/04/13/how-to-check-if-a-table-exists-in-sql-server/
relacionada, si no duplica: [comprobar si existe tabla en SQL Server] (http://stackoverflow.com/q/167576/456814). –
Esta es una gran pregunta que cualquier persona que trabaje con SQL Server preguntará eventualmente. Es triste que SQL Server no tenga el amigable estilo Oracle CREAR O REEMPLAZAR – Davos
Para MySQL puede usar 'CREATE TABLE IF NOT EXISTS ...' –