2015-07-20 4 views
0

У меня есть много баз данных, которые на моем ящике SQL Server, которые начинаются с префикса zzz.Как быстро удалить все базы данных, чье имя соответствует шаблону?

Есть ли способ сделать DROP DATABASE (или какой-либо другой метод), который удалит и удалит файлы данных? Если соединение открыто, я хочу его закрыть.

В основном я просто хочу их ушел.

+0

Посмотрите, пожалуйста, базы данных для списка баз данных. Затем бросьте их. –

+0

Один из вариантов, если вы предпочитаете ничего не писать, будет в SSMS, нажмите view -> Object Explorer Details, и отсюда вы можете выделить/выбрать несколько и удалить – Dan

ответ

1
use master; 
go 

- это будет отбрасывать все DBS, которые начинаются с t5 ....

declare @strsql varchar(500) 
declare @curname sysname 
select @curname = name from sys.databases 
where name like 't5%' 

while(@@rowcount> 0) 
begin 
set @strsql ='ALTER DATABASE ' [email protected] +' SET OFFLINE WITH ROLLBACK IMMEDIATE' 
exec (@strsql) 
set @strsql ='drop database '[email protected] 
exec (@strsql) 
select @curname = name from sys.databases 
where name like 't5%' 
end 
+0

Это удалит только одну базу данных, и она останется за файлами MDF и LDF, а также – WhiskerBiscuit

+0

. Я создал две базы данных с именем t5a и t5b, а затем запустил мой скрипт. Обе базы данных были удалены из sys.databases и были удалены из экземпляра. Чтобы мой скрипт удалил файлы mdf/ldf, смените скрипт с SET OFFLINE WITH ROLLBACK IMMEDIATE на ALTER DATABASE [имя_базы данных] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; Не удаляя файлы сразу, вы можете отменить удаление. –

1

Вы можете написать динамический SQL, чтобы сделать это:

use master 
go 
declare @dbnames nvarchar(max) 
declare @statement nvarchar(max) 
declare @closeconnection nvarchar(max) 
set @dbnames = '' 
set @statement = '' 
select @dbnames = @dbnames + ',[' + name + ']' from sys.databases where name like 'zzz%' 
if len(@dbnames) = 0 
    begin 
    print 'no databases to drop' 
    end 
else 
    BEGIN 
    SET @closeconnection = 'alter database ' + substring(@dbnames, 2, len(@dbnames)) 
          + ' SET SINGLE_USER WITH ROLLBACK IMMEDIATE' 
    set @statement = 'drop database ' + substring(@dbnames, 2, len(@dbnames)) 
    print @statement 
    EXEC sp_executesql @closeconnection; 
    exec sp_executesql @statement; 
    end 

Обычно, синтаксис, чтобы закрыть все активные подключения к базе данных:

--set it to single user to disable any other connections 
ALTER DATABASE YourDatabase SET SINGLE_USER WITH ROLLBACK IMMEDIATE 

--do your stuff here 

--set it back to multiple users 
ALTER DATABASE YourDatabase SET MULTI_USER 

В качестве альтернативы, вы можете также генерировать динамический выберите этот список, который заполняет выписку из базы данных выписок следующим образом:

USE master; 
Go 
SELECT 'DROP DATABASE '+ name, 
     'alter database ' + name + ' SET SINGLE_USER WITH ROLLBACK IMMEDIATE' 
FROM sys.databases WHERE name like 'zzz%'; 
GO 

Предоставлено: @SeriousM and OFH

2

Сформировать падение сценарий, копировать/вставить & пробег:

exec master.sys.sp_msforeachdb 'if ''?'' like ''ZZZ%'' print ''drop database [?]''' 

Или падение непосредственно в строке SQL, если ваш храбрый.

+0

. Эта процедура не является случайной пропуском баз данных , Это недокументированная процедура, которая также оказалась ненадежной. Вот хорошее обсуждение темы. http://sqlblog.com/blogs/aaron_bertrand/archive/2010/12/29/a-more-reliable-and-more-flexible-sp-msforeachdb.aspx –

+0

Я прочитал это как один из быстрых исправлений, скорее всего, хороший достаточно для этого –

+0

Принято из-за простоты. Однако я ценю другие ответы. – WhiskerBiscuit

0

Я изменил сценарий Беньямина немного, так что у вас есть только объявить префикс один раз.

use master; 
declare @dbPrefix varchar(10) 
set @dbPrefix = 'zzz_%'; 

declare @strsql varchar(500) 
declare @curname sysname 
select @curname = name from sys.databases 
where name like @dbPrefix 

while(@@rowcount> 0) 
    begin 
     set @strsql ='ALTER DATABASE ' [email protected] +' SET SINGLE_USER WITH ROLLBACK IMMEDIATE' 
     exec (@strsql) 
     set @strsql ='drop database '[email protected] 
     exec (@strsql) 
     select @curname = name from sys.databases 
     where name like @dbPrefix 
    end