我有很多数据库,在我的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