2016-03-19 14 views
0

Nun, was ich hier versuche, ist das Ablegen der Datenbank von meinem SQL Server auf der Grundlage einer beliebigen Bedingung (innerhalb eines IF-Block), z. Wenn die Datenbank existiert, löschen und neu erstellen.SQL Server 2008 R2: Drop-Datenbank auf Bedingung

ich folgenden Code verwende:

IF EXISTS (SELECT 1 FROM sys.databases db with(nolock) WHERE db.name = 'practice') 
BEGIN 
    USE master 
    DROP DATABASE practice 
END 

Dieser Code für ein paar Minuten auf die Ausführung hält und antwortet dann mit einer Fehlermeldung,

Msg 3702, Level 16, State 4, Line 1
Cannot drop database "practice" because it is currently in use.

Dann für einen weiteren Versuch ich eine GO-Anweisung innerhalb Mein Code, um den Ausführungsfluss zu trennen, mit folgendem Code (HINWEIS: Dies hat auch eine Datenbankanweisung):

IF EXISTS (SELECT 1 FROM sys.databases db with(nolock) WHERE db.name = 'practice') 
BEGIN 
    USE master 
    GO 

    DROP DATABASE practice 
    GO 

    CREATE DATABASE practice 
END 

Jetzt wirft er diesen Fehler:

Msg 102, Level 15, State 1, Line 3
Incorrect syntax near 'master'.
Msg 3702, Level 16, State 4, Line 1
Cannot drop database "practice" because it is currently in use.
Msg 102, Level 15, State 1, Line 2
Incorrect syntax near 'END'

Ich weiß nicht, ob ich bin etwas fehlt, oder gibt es eine Abhilfe, die getan werden muss.

Ich wäre auch an besseren Alternativen interessiert, um diesen Zweck zu erfüllen, wenn überhaupt.

Ich weiß nicht, ob das überhaupt machbar ist.

Grüße, Shanks

Antwort

0

Wie die Fehlermeldung schon sagt, Datenbank ist in use.You Datenbanken gewaltsam mit unter Skript

fallen kann
if exists(select * from sys.sysdatabases where name ='test') 
    begin 
    use master; 

    alter database test 
    set single_user with rollback immediate; 

    drop database test; 

    end 
0

Sie auch eine

tun können
sp_who2 

um zu sehen, wer oder was mit dieser DB verbunden ist. Sie können dann einen

KILL SPID# (i.e. "KILL 54") 

verwenden, um das Schließen dieser Verbindung zu erzwingen. Dies ist gefährlich, wenn Sie in Produktion sind, aber wenn Sie die DB sowieso fallen lassen und neu erstellen ...

Dies ist ein wenig chirurgischer als was @TheGameiswar schlägt, ist aber sehr ähnlich.

0

Für die Zwecke der Praxis kann folgenden Code verwenden:

EXEC msdb.dbo.sp_delete_database_backuphistory @database_name = N'practice' 
GO 
USE [master] 
GO 
ALTER DATABASE [practice] SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
GO 
DROP DATABASE [practice] 
GO 

jetzt können Sie Ihre neue DB erstellen.