我有很多數據庫,在我的SQL Server框中以前綴zzz
開頭。如何快速刪除名稱與patttern匹配的所有數據庫?
有沒有辦法做一個DROP DATABASE
(或其他方法),將刪除和刪除數據文件?如果連接打開,我希望它關閉。
基本上我只是想讓他們不見了。
我有很多數據庫,在我的SQL Server框中以前綴zzz
開頭。如何快速刪除名稱與patttern匹配的所有數據庫?
有沒有辦法做一個DROP DATABASE
(或其他方法),將刪除和刪除數據文件?如果連接打開,我希望它關閉。
基本上我只是想讓他們不見了。
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
這隻會刪除一個數據庫,並且還會留下MDF和LDF文件 – WhiskerBiscuit
我創建了兩個名爲t5a和t5b的數據庫,然後運行我的腳本。兩個數據庫都從sys.databases中刪除,並從實例中刪除。要讓我的腳本刪除mdf/ldf文件,請將腳本從SET OFFLINE WITH ROLLBACK IMMEDIATE更改爲ALTER DATABASE [databasename] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;通過不立即刪除文件,您可以撤消刪除。 –
你可以寫一個動態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
生成一個腳本下降,複製/粘貼&運行:
exec master.sys.sp_msforeachdb 'if ''?'' like ''ZZZ%'' print ''drop database [?]'''
或直接在SQL字符串,如果你勇敢的下降。
該過程沒有時偶爾錯過數據庫。這是一個無證的程序,也被證明是不可靠的。這是一個很好的討論主題。 http://sqlblog.com/blogs/aaron_bertrand/archive/2010/12/29/a-more-reliable-and-more-flexible-sp-msforeachdb.aspx –
我讀這是一個快速修復,可能是好的足夠爲 –
由於簡單接受。然而,我讚賞其他答覆。 – WhiskerBiscuit
我修改本傑明的腳本了一點,所以你只需要一次申報的前綴。
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
查看sys.databases獲取數據庫列表。然後放下它們。 –
一個選項,如果你不想寫任何東西,將會在SSMS中點擊view - > Object Explorer Details,然後從這裏突出顯示/選擇多個,然後刪除 – Dan