SQL Server 2008 R2: удаление базы данных при условии

Теперь я пытаюсь удалить базу данных из моего SQL Server на основе любого условия (например, внутри блока IF). Если база данных существует, удалите и создайте ее заново.

Я использую следующий код:

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

Этот код продолжает выполняться в течение пары минут, а затем отвечает с ошибкой, говоря

Сообщение 3702, уровень 16, состояние 4, строка 1
Невозможно удалить базу данных "практика", потому что она в настоящее время используется.

Затем для другой попытки я использовал инструкцию GO в своем коде, чтобы отделить поток выполнения, со следующим кодом (ПРИМЕЧАНИЕ, это также создает оператор базы данных):

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

Теперь он выдает эту ошибку:

Сообщение 102, Уровень 15, Состояние 1, Строка 3
Неверный синтаксис рядом с "master".
Сообщение 3702, уровень 16, состояние 4, строка 1
Невозможно удалить базу данных "практика", потому что она в настоящее время используется.
Сообщение 102, Уровень 15, Состояние 1, Строка 2
Неверный синтаксис рядом с 'END'

Я не знаю, что я что-то упустил или есть обходной путь, который нужно сделать.

Кроме того, я был бы заинтересован в лучших альтернативах для этой цели, если таковые имеются.

Я не знаю, возможно ли это вообще.

С уважением, Шенкс

3 ответа

Вы также можете сделать

sp_who2 

чтобы увидеть, кто или что связано с этой БД. Затем вы можете использовать

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

заставить эту связь закрыться. Это опасно, если вы находитесь в производстве, но если вы все равно сбрасываете и воссоздаете БД...

Это немного более хирургически, чем то, что предлагает @TheGameiswar, но очень похоже.

Для целей практики можно использовать следующий код:

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

Теперь вы можете создать свою новую базу данных.

Как следует из сообщения об ошибке, база данных используется. Вы можете принудительно удалить базы данных, используя скрипт ниже

 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
Другие вопросы по тегам