2011-07-06 56 views
19

我想驗證一個表是否存在於一個數據庫中,如果它不存在,就創建它。 如何獲得當前數據庫中所有表的列表?如何使用MS SQL 2008獲取數據庫中的表列表?

我可以用一個SELECT這樣得到的數據庫列表:

SELECT * FROM sys.databases 

剩下的就是創建表,如果它不存在。

我也試圖在同一時間,像這樣的數據庫中創建表:

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 

但它給了我錯誤的「使用」行,他說,「DB」不存在。這一次,我會嘗試在兩個不同的命令中做到這一點。

回答

38

這應該給您在數據庫中的所有表的列表中的所有表

SELECT Distinct TABLE_NAME FROM information_schema.TABLES 

所以,你可以用它類似於您數據庫檢查。

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

這個查詢將讓你在數據庫

USE [DatabaseName]; 

SELECT * FROM information_schema.tables; 
5

回答這個問題在您的標題,您可以查詢sys.tablessys.objects其中type = 'U'檢查表的存在。您也可以使用OBJECT_ID('table_name','U')。如果它返回一個非空值,則表存在:如果你要創建的數據庫,然後開始使用

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

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

你可以用DB_ID()做相同的數據庫它需要分批進行。我不知道你的案件的具體情況,但不應該有很多情況下這是不可能的。在SQL腳本中,您可以使用GO語句。在一個應用程序中,創建數據庫之後很容易發送新的命令。

你可能有一個問題的唯一的地方是,如果你試圖在存儲過程中這樣做,並像這樣動態創建數據庫通常是一個壞主意。

如果你真的需要做到這一個批次中,你能找到解決這個問題,通過使用EXEC繞過數據庫的解析錯誤不存在:

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 

編輯:正如其他有建議,INFORMATION_SCHEMA.TABLES系統視圖可能是可取的,因爲它被認爲是一個標準,可能在RDBMS之間。

+0

謝謝,你給出了一個非常好的答案,但是,對於初學SQL的人來說,它似乎有些過於先進。非常感謝你。 – Tibi

相關問題