2011-07-06 14 views
19

Quiero verificar si existe una tabla en una base de datos, y si no existe, para crearla. ¿Cómo puedo obtener una lista de todas las tablas en la base de datos actual?¿Cómo obtener la lista de tablas en la base de datos, usando MS SQL 2008?

pudiera conseguir la lista de base de datos con un SELECT de esta manera:

SELECT * FROM sys.databases 

Lo que queda es para crear la tabla si no existe.

También probé para crear las tablas al mismo tiempo con la base de datos de esta manera:

if not exists(select * from sys.databases where name = 'db') 
begin 
    create database [db] 
    use [db]; 
    create table [test] (
     Time datetime, 
     Message varchar(1024)) 
    end 

pero me da error en la línea 'uso', diciendo que no existe 'db'. Esta vez, intentaré hacer esto en 2 comandos diferentes.

Respuesta

38

Esto debe darle una lista de todas las tablas de la base de datos de

SELECT Distinct TABLE_NAME FROM information_schema.TABLES 

Para que puedas usarlo similar a su verificación de base de datos.

If NOT EXISTS(SELECT Distinct TABLE_NAME FROM information_schema.TABLES Where TABLE_NAME = 'Your_Table') 
BEGIN 
    --CREATE TABLE Your_Table 
END 
GO 
9

Esta consulta le dará todas las tablas en la base de datos

USE [DatabaseName]; 

SELECT * FROM information_schema.tables; 
5

Respondiendo a la pregunta en su título, se puede consultar sys.tables o sys.objects donde type = 'U' para comprobar la existencia de una mesa. También puede usar OBJECT_ID ('table_name', 'U'). Si devuelve un valor no nulo a continuación, existe la tabla:

IF (OBJECT_ID('dbo.My_Table', 'U') IS NULL) 
BEGIN 
    CREATE TABLE dbo.My_Table (...) 
END 

Usted puede hacer lo mismo para las bases de datos con DB_ID():

IF (DB_ID('My_Database') IS NULL) 
BEGIN 
    CREATE DATABASE My_Database 
END 

Si desea crear la base de datos y luego empezar a utilizar esto, eso debe hacerse en lotes separados. No conozco los detalles de su caso, pero no debería haber muchos casos donde esto no sea posible. En una secuencia de comandos SQL, puede usar las declaraciones GO. En una aplicación, es bastante fácil enviar un nuevo comando después de que se crea la base de datos.

El único lugar donde podría tener un problema es si intentaba hacer esto en un procedimiento almacenado y crear bases de datos sobre la marcha, como suele ser una mala idea.

Si realmente necesita hacer esto en un solo lote, se puede conseguir alrededor del problema utilizando EXEC para moverse por la error de análisis de la base de datos no existente:

CREATE DATABASE Test_DB2 

IF (OBJECT_ID('Test_DB2.dbo.My_Table', 'U') IS NULL) 
BEGIN 
    EXEC('CREATE TABLE Test_DB2.dbo.My_Table (my_id INT)') 
END 

EDIT: Como otros tienen sugerido, la vista del sistema INFORMATION_SCHEMA.TABLES es probablemente preferible ya que supuestamente es un estándar en el futuro y posiblemente entre los RDBMS.

+0

Gracias, usted ha dado una respuesta muy buena, sin embargo, parece demasiado avanzada para un principiante en SQL. Muchas gracias. – Tibi

Cuestiones relacionadas