2011-07-06 15 views
19

Chcę sprawdzić, czy tabela istnieje w bazie danych, a jeśli nie istnieje, aby ją utworzyć. Jak mogę uzyskać listę wszystkich tabel w bieżącej bazie danych?Jak uzyskać listę tabel w bazie danych za pomocą MS SQL 2008?

mogę dostać listę baz danych z wybraną tak:

SELECT * FROM sys.databases 

Co pozostało jest stworzenie tabeli, jeśli nie istnieje.

Próbowałem też do stworzenia tabel w tym samym czasie z bazy danych takie jak to:

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 

Ale to daje mi błąd w wierszu „użytkowania”, mówiąc, że „db” nie istnieje. Tym razem postaram się to zrobić w 2 różnych poleceniach.

Odpowiedz

38

to powinno dać Ci listę wszystkich tabel w bazie danych

SELECT Distinct TABLE_NAME FROM information_schema.TABLES 

więc można go używać podobny do listy sprawdzenie bazy danych.

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

To zapytanie będzie Ci wszystkie tabele w bazie danych

USE [DatabaseName]; 

SELECT * FROM information_schema.tables; 
5

Odpowiadając na pytanie w tytule, można wyszukać sys.tables lub sys.objects gdzie type = 'U' w celu sprawdzenia istnienia tabeli. Możesz także użyć OBJECT_ID ("table_name", "U"). Jeśli zwróci niepustą wartość wówczas istnieje tabela:

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

Można zrobić to samo dla baz danych z DB_ID():

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

Jeśli chcesz utworzyć bazę danych, a następnie uruchomić za pomocą to musi być zrobione w osobnych partiach. Nie znam szczegółów twojej sprawy, ale nie powinno być wielu przypadków, w których nie jest to możliwe. W skrypcie SQL można użyć instrukcji GO. W aplikacji łatwo jest przesłać nowe polecenie po utworzeniu bazy danych.

Jedynym miejscem, w którym możesz mieć problem jest to, że próbujesz to zrobić w procedurze przechowywanej i tworzenie baz danych w locie, jak to zwykle jest zły pomysł.

Jeśli naprawdę trzeba to zrobić w jednej serii, można obejść problem przy użyciu EXEC, aby ominąć parsowanie błędów bazy danych nie istniejące:

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: Jak inni zasugerowano, że widok systemu jest prawdopodobnie lepszy, ponieważ jest podobno standardem idącym dalej i prawdopodobnie pomiędzy RDBMS.

+0

Dzięki, dałeś bardzo dobrą odpowiedź, jednak wydaje się to trochę zbyt zaawansowane dla początkującego w SQL. Dziękuję Ci bardzo. – Tibi

Powiązane problemy