Saltar al contenido

Verifique si existe la tabla y si no existe, créela en SQL Server 2008

Nuestros mejores desarrolladores agotaron sus depósitos de café, por su búsqueda todo el tiempo por la resolución, hasta que Joaquín encontró la respuesta en Beanstalk así que ahora la compartimos con nosotros.

Solución:

Algo como esto

IF  NOT EXISTS (SELECT * FROM sys.objects 
WHERE object_id = OBJECT_ID(N'[dbo].[YourTable]') AND type in (N'U'))

BEGIN
CREATE TABLE [dbo].[YourTable](
    ....
    ....
    ....
) 

END

Solo por contraste, me gusta usar la función object_id como se muestra a continuación. Es un poco más fácil de leer y no tiene que preocuparse por sys.objects vs. sysobjects vs. sys.all_objects vs. sys.tables. Forma básica:

IF object_id('MyTable') is not null
    PRINT 'Present!'
ELSE
    PRINT 'Not accounted for'

Por supuesto, esto se mostrará como “Presente” si hay ninguna objeto presente con ese nombre. Si desea verificar solo las tablas, necesitaría:

IF object_id('MyTable', 'U') is not null
    PRINT 'Present!'
ELSE
    PRINT 'Not accounted for'

También funciona para tablas temporales:

IF object_id('tempdb.dbo.#MyTable') is not null
    PRINT 'Present!'
ELSE
    PRINT 'Not accounted for'

Vamos a crear una base de datos de muestra con una tabla mediante el siguiente script:

CREATE DATABASE Test
GO
USE Test
GO
CREATE TABLE dbo.tblTest (Id INT, Name NVARCHAR(50))

Enfoque 1: Uso de la vista INFORMACION_ESQUEMA.TABLAS

Podemos escribir una consulta como la siguiente para verificar si existe una tabla tblTest 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 verificar la existencia de la tabla en un esquema específico y la base de datos especificada, 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: las vistas de INFORMATION_SCHEMA son portátiles en diferentes sistemas RDBMS, por lo que la migración a diferentes RDBMS no requiere ningún cambio.

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

Nosotros podemos usar OBJECT_ID() como se muestra a continuación para comprobar si existe una tabla tblTest 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 de las partes Nombre de la base de datos y Nombre del esquema para el Nombre de la tabla es opcional. Pero especificar el nombre de la base de datos y el nombre del esquema 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 siguiente consulta muestra que aunque la base de datos actual es la base de datos MAESTRA, podemos verificar la existencia de la tblTest mesa en el dbo esquema en el Test base de datos.

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 a mencionar sobre OBJECT_ID() La función 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 comprueban la existencia de la tabla temporal creada en todo el contexto de conexiones en lugar de solo en el contexto de conexión actual. La siguiente consulta muestra cómo verificar la existencia de una tabla temporal usando 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 la vista de catálogo de sys.Objects

Podemos usar el Sys.Objects vista de catálogo 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.tblTest') AND Type = N'U')
BEGIN
  PRINT 'Table Exists'
END

Enfoque 4: uso de la vista de catálogo sys.Tables

Podemos usar el Sys.Tables vista de catálogo para verificar la existencia de la Tabla 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 Sys.Objects vista de 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 solo para los objetos de la tabla, mientras que Sys.Object view además de devolver las filas para los objetos de la tabla, devuelve filas para los objetos como: procedimiento almacenado, vistas, etc.

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

Debemos evitar el uso sys.sysobjects Tabla del sistema directamente, el acceso directo a ella quedará obsoleto en algunas versiones futuras del servidor Sql. según [Microsoft BOL][1] enlace, Microsoft sugiere usar las vistas de catálogo sys.objects/sys.tables en lugar de sys.sysobjects tabla del sistema 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/

Agradecemos que quieras añadir valor a nuestro contenido informacional añadiendo tu experiencia en las notas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *