2015-07-20 43 views
0

我有很多数据库,在我的SQL Server框中以前缀zzz开头。如何快速删除名称与patttern匹配的所有数据库?

有没有办法做一个DROP DATABASE(或其他方法),将删除和删除数据文件?如果连接打开,我希望它关闭。

基本上我只是想让他们不见了

+0

查看sys.databases获取数据库列表。然后放下它们。 –

+0

一个选项,如果你不想写任何东西,将会在SSMS中点击view - > Object Explorer Details,然后从这里突出显示/选择多个,然后删除 – Dan

回答

1
use master; 
go 

- 这将下降,与T5开头的所有DBS ....

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 [databasename] 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 

或者,你也可以生成一个动态选择列表,填充您的drop database语句以及像这样的关闭连接语句:

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 
相关问题