2015-07-20 31 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 
相關問題