2011-07-06 21 views
19

Veritabanında bir tablo olup olmadığını ve varsa, oluşturmak için bir veri olup olmadığını doğrulamak istiyorum. Geçerli veritabanındaki tüm tabloların listesini nasıl alabilirim?Veritabanı içinde MS SQL 2008 kullanarak tablo listesi nasıl alınır?

Böyle bir SELECT ile veritabanı listesini alabilir: o yoksa geriye ne

SELECT * FROM sys.databases 

tablo oluşturmaktır.

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 

Ama bu db 'var olmadığını söyleyerek, 'kullanım' satırında bana hata veriyor:

Ben de böyle veritabanı ile aynı anda tablolar oluşturmak için çalıştık. Bu sefer 2 farklı komutta bunu yapmaya çalışacağım.

cevap

38

veritabanında size tüm tabloları alacak

SELECT Distinct TABLE_NAME FROM information_schema.TABLES 

Yani için benzer kullanabilir.NEWLINENEWLINEKonum veritabanı denetimi.

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

Bu sorgu Bu veritabanında size tüm tabloların bir listesini vermelidir

USE [DatabaseName]; 

SELECT * FROM information_schema.tables; 
5

başlığınızdaki sorusunu yanıtlayan bir tablonun varlığını denetlemek için sys.tables veya type = 'U'sys.objects sorgulayabilir. Ayrıca OBJECT_ID ('table_name', 'U') kullanabilirsiniz. o boş olmayan bir değer döndürürse sonra tablo var:

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

Sen DB_ID() ile veritabanları için aynı şeyi yapabilirsiniz:

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

veritabanını oluşturmak ve sonra da kullanmaya başlamak istiyorsanız Bu, ayrı gruplar halinde yapılması gerekiyor. Davanızın ayrıntılarını bilmiyorum, ancak bunun mümkün olmadığı pek çok durum olmamalı. Bir SQL komut dosyasında GO ifadelerini kullanabilirsiniz. Bir uygulamada, veritabanı oluşturulduktan sonra yeni bir komut göndermek için yeterince kolaydır.

Bir sorunla karşılaşabileceğiniz tek yer, bunu saklı bir yordamda yapmaya çalışıyor olmanız ve böyle bir durumda genellikle kötü bir fikir gibi anında veritabanları oluşturuyor olmanızdır.

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 

DÜZENLEME: diğerleri var gibi gerçekten bir toplu bunu yapmak gerekirse

, mevcut değil veritabanının ayrıştırma hatası etrafında almak için EXEC kullanarak soruna alabilirsiniz önerildiği gibi, INFORMATION_SCHEMA.TABLES sistem görünümü, muhtemelen ileriye dönük ve muhtemelen RDBMS'ler arasında bir standart olduğu için tercih edilir.

+0

Teşekkürler, çok iyi bir yanıt verdiniz, ancak SQL'de yeni başlayanlar için biraz fazla gelişmiş görünüyor. Çok teşekkür ederim. – Tibi