2012-09-11 37 views
43

veritabanları bırakma ve yeniden oluşturma Microsoft SQL Server 2008 R2 SP1 ile deneme ve öğreniyorum. Birçok denemeler yaptığım bir veritabanım var. Şimdi onu bırakmak ve yeniden yaratmak istiyorum. Bu yüzden, oluşturma komut dosyasını veritabanından ayırıyorum, onu siliyorum ve yeniden oluşturmak için betiği kullanıyorum. Sürprizime göre, tüm masalar, anahtarlar vb. Veritabanını nasıl sıfırlayabilirim, böylece veritabanını sıfırdan yeniden oluşturabilir miyim?Microsoft SQL Server

cevap

76
USE master 
IF EXISTS(select * from sys.databases where name='yourDBname') 
DROP DATABASE yourDBname 

CREATE DATABASE yourDBname 
+0

Haklısın, sorum benim için aptalcaydı. Aslında, görmeye devam ettiğim tablolar aslında veritabanımda değil, ana veritabanında oluşturuldu. –

+0

Bu bana çok yardımcı oldu! –

1

Ben Bu veritabanında her şeyi (masalar, anahtarlar vb) yönelik oluşturma komut dizisini veritabanı

den oluşturma komut dizisini. sadece boş bir veritabanı oluşturmak istiyorsanız, sadece kod rolünden dolayı AnandPhadke için CREATE DATABASE <dbname>

22

+1 çalıştırmak

sonra veritabanına tüm etkin bağlantıları kapatıp olacak Bu kod bunu

damla
WHILE EXISTS(select NULL from sys.databases where name='YourDBName') 
BEGIN 
    DECLARE @SQL varchar(max) 
    SELECT @SQL = COALESCE(@SQL,'') + 'Kill ' + Convert(varchar, SPId) + ';' 
    FROM MASTER..SysProcesses 
    WHERE DBId = DB_ID(N'YourDBName') AND SPId <> @@SPId 
    EXEC(@SQL) 
    DROP DATABASE [YourDBName] 
END 
GO 

CREATE DATABASE YourDBName 
GO 
6

Birden çok kez yazılacak DBName gerekli olduğunda hata eğilimli, bir noktada tutarsız girişler ve istenmeyen sonuçlarla yürütülür.

AnandPhadke veya Pierre'in değişken destekli cevapları benim için tercih edilebilir.

DECLARE @DBName varchar(50) = 'YourDatabaseName' 
USE master 
IF EXISTS(select * from sys.databases where name= @DBName) 
EXEC('DROP DATABASE ' + @DBName) 

EXEC('CREATE DATABASE ' + @DBName) 

veya

DECLARE @DBName varchar(50) = 'YourDatabaseName' 
WHILE EXISTS(select NULL from sys.databases where name = @DBName) 
BEGIN 
    DECLARE @SQL varchar(max) 
    SELECT @SQL = COALESCE(@SQL,'') + 'Kill ' + Convert(varchar, SPId) + ';' FROM MASTER..SysProcesses WHERE DBId = DB_ID(@DBName) AND SPId <> @@SPId 
    EXEC(@SQL) 
    EXEC('DROP DATABASE ' + @DBName) 
END 
GO 
-1

Bu benim için en iyi şekilde çalışır: (?)

if exists (select name from sys.databases where name='YourDBName') 
alter database YourDBName set single_user with rollback immediate 
go 
if exists (select name from sys.databases where name='YourDBName') 
drop database YourDBName 
+0

Bu soruya gerçekten cevap vermiyor. Farklı bir sorunuz varsa, [Soru Sor] 'u tıklayarak sorabilirsiniz (http://stackoverflow.com/questions/ask). Yeterli [itibara] sahip olduğunuzda [http://stackoverflow.com/help/] de bu soruya daha fazla dikkat çekmek için [bir hediye] ekleyebilirsiniz (http://stackoverflow.com/help/privileges/set-bounties). neyin-itibar). - [Yorum Yaz] (/ review/düşük kaliteli yazılar/12598382) –

+0

Bu cevabı yanlış yazdığınızı düşünüyorum, KhanImranAli. Bu, zayıf olsa da, cevap vermeye çalışır. Bu, işaretleme ve olumsuz inceleme yoluyla değil oylamayla yönetilmelidir. – Palec

+1

Lütfen kodunuzun ne yaptığını ve bu soruya nasıl cevap verdiğini açıklayın. Bir kod snippet'ini cevap olarak alırsanız, bununla ne yapacağınızı bilmeyebilirsiniz. Cevap, OP ve gelecek ziyaretçilere rehberlik etmelidir. Konuya dikkat etmek gerekirse, kodunuzun ardındaki fikir, sorunu anlamada ve çözümünüzü uygulamada veya değiştirmede büyük ölçüde yardımcı olur. – Palec