2011-05-10 39 views
99

Estoy escribiendo un Stored procedure en SQL Server 2008 tengo que comprobar si un table existen en la base de datos, si no lo hace entonces Necesito crearlo.cómo comprobar si la tabla existe y si no existe Crear una tabla en SQL Server 2008

¿Cómo lo hago?

+1

relacionada, si no duplica: [comprobar si existe tabla en SQL Server] (http://stackoverflow.com/q/167576/456814). –

+1

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

+0

Para MySQL puede usar 'CREATE TABLE IF NOT EXISTS ...' –

Respuesta

119

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

Si no estoy equivocado, esto debería funcionar:

if not exists (Select 1 from tableName) 
create table ... 
+2

¿Qué pasa si la tabla existe pero está vacía? Esto será cierto en ese caso – SQLMenace

+0

@SQLMeance Oh, de acuerdo, entiendo por su respuesta que está buscando el tipo 'U' en sys.objects, ¿podría ayudarme a entender, por qué lo recomienda? y puede una tabla existir en cualquier otro lugar? Gracias de antemano – RaM

+0

U = tabla de usuario, consulte aquí http://msdn.microsoft.com/en-us/library/ms190324.aspx – SQLMenace

0

Pruebe la siguiente declaración para comprobar la existencia de una tabla en la base de datos:

If not exists (select name from sysobjects where name = 'tablename') 

Puede crear la tabla dentro del bloque if.

+3

Mientras que la sintaxis funcionará, 'sysobjects' es una vista de compatibilidad que existe solo para evitar rompiendo el código anterior. Mi sugerencia sería usar vistas del catálogo del sistema (por ejemplo, 'sys.objects',' sys.tables') para el código que solo apuntará a instancias de SQL Server 2008, y vistas de esquema de información (por ejemplo, 'information_schema.tables') para el código que necesita ser portátil. Puede encontrar más información sobre las diferentes vistas aquí: [Consultar el catálogo del sistema de SQL Server] (http://msdn.microsoft.com/en-us/library/ms189082.aspx) – ajk

122

Solo por el contrario, 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 cualquier objeto presente con ese nombre. Si desea comprobar sólo las tablas, lo que se necesita:

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

Funciona para tablas temporales, así:

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

OBJECT_ID() reference: http: // msdn.microsoft.com/en-us/library/ms190328.aspx – gonsalu

+3

Eso fue perfecto. Gracias. – djangofan

+2

Normalmente veo el otro método utilizado (verificando las tablas del sistema) pero esto parece más legible y compacto. ¿Hay alguna razón para no preferir este método a la respuesta aceptada? (Tales como problemas de compatibilidad con la migración de SQL a diferentes proveedores de DB, velocidad, etc.)? –

11

editado

Usted puede mirar en sys.tables de comprobación de la existencia tabla deseada:

IF NOT EXISTS (SELECT * FROM sys.tables 
WHERE name = N'YourTable' AND type = 'U') 

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

END 
2
IF (EXISTS (SELECT * 
       FROM INFORMATION_SCHEMA.TABLES 
       WHERE TABLE_NAME = 'd020915')) 
BEGIN 
    declare @result int 
    set @result=1 
    select @result as result 
END 
7

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/

+0

Es importante tener en cuenta que esta respuesta proporciona qué enfoque necesita que se especifique la base de datos y cuáles no. Esto es extremadamente valioso y para las secuencias de comandos que se ejecutan para configurar y actualizar una base de datos operativa cuando hay múltiples de la misma base de datos ejecutándose en la misma instancia, esta es la clave. Gran información –

Cuestiones relacionadas