2011-07-06 42 views
19

Tôi muốn xác minh xem bảng có tồn tại trong cơ sở dữ liệu hay không và nếu nó không tồn tại, để tạo bảng. Làm cách nào để có danh sách tất cả các bảng trong cơ sở dữ liệu hiện tại?Cách lấy danh sách bảng trong cơ sở dữ liệu, sử dụng MS SQL 2008?

tôi có thể nhận được danh sách cơ sở dữ liệu với một SELECT như sau:

SELECT * FROM sys.databases 

Những gì còn lại là tạo ra bảng nếu nó không tồn tại.

Tôi cũng đã cố gắng để tạo ra các bảng cùng lúc với cơ sở dữ liệu như thế này:

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 

Nhưng nó mang lại cho tôi lỗi trên 'sử dụng' dòng, nói rằng 'db' không tồn tại. Lần này, tôi sẽ cố gắng làm điều này trong 2 lệnh khác nhau.

Trả lời

38

này nên cung cấp cho bạn một danh sách tất cả các bảng trong cơ sở dữ liệu của bạn

SELECT Distinct TABLE_NAME FROM information_schema.TABLES 

Vì vậy, bạn có thể sử dụng nó tương tự như của bạn kiểm tra cơ sở dữ liệu.

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

Truy vấn này sẽ giúp bạn có được tất cả các bảng trong cơ sở dữ liệu

USE [DatabaseName]; 

SELECT * FROM information_schema.tables; 
5

Trả lời câu hỏi ở tiêu đề của bạn, bạn có thể truy vấn sys.tables hoặc sys.objects nơi type = 'U' để kiểm tra sự tồn tại của một bảng. Bạn cũng có thể sử dụng OBJECT_ID ('table_name', 'U'). Nếu nó trả về một giá trị không null thì bàn tồn tại:

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

Bạn có thể làm tương tự cho cơ sở dữ liệu với DB_ID():

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

Nếu bạn muốn tạo cơ sở dữ liệu và sau đó bắt đầu sử dụng nó, mà cần phải được thực hiện trong các lô riêng biệt. Tôi không biết cụ thể về vụ việc của bạn, nhưng không nên có nhiều trường hợp điều này là không thể. Trong tập lệnh SQL, bạn có thể sử dụng câu lệnh GO. Trong một ứng dụng, nó đủ dễ dàng để gửi qua một lệnh mới sau khi cơ sở dữ liệu được tạo ra.

Nơi duy nhất mà bạn có thể có vấn đề là nếu bạn đang cố gắng thực hiện điều này trong một quy trình được lưu trữ và tạo cơ sở dữ liệu khi đang chạy như vậy thường là một ý tưởng tồi.

Nếu bạn thực sự cần phải làm điều này trong một mẻ, bạn có thể khắc phục vấn đề này bằng cách sử dụng EXEC để có được xung quanh lỗi phân tích cú pháp của cơ sở dữ liệu không tồn tại:

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: Như những người khác có được đề xuất, chế độ xem hệ thống INFORMATION_SCHEMA.TABLES có thể thích hợp hơn vì nó được cho là một tiêu chuẩn đi tiếp và có thể giữa RDBMS.

+0

Cảm ơn, bạn đã đưa ra một câu trả lời rất tốt, tuy nhiên, nó có vẻ hơi quá nâng cao cho người mới bắt đầu tại SQL. Cảm ơn nhiều. – Tibi

Các vấn đề liên quan