从服务器删除所有数据库

问题描述 投票:36回答:9

我有一个服务器(SQL Server 2005)有超过300个数据库。我不想一个一个地右键单击并选择Delete

如何轻松删除所有数据库?

sql sql-server sql-server-2005
9个回答
95
投票

您可以通过SSMS GUI执行此操作。选择Databases节点,然后选择F7以显示对象资源管理器详细信息,选择要删除的所有数据库,点击“删除”并选择“关闭现有连接”和“错误后继续”选项。

或者通过TSQL你可以做到

EXEC sp_MSforeachdb '
IF DB_ID(''?'') > 4
BEGIN
ALTER DATABASE [?] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
DROP DATABASE [?]
END'

由于原因应该是显而易见的,因此您可能希望用DROP命令替换PRINT命令以首先验证事情,因此上述内容未经测试。

EXEC sp_MSforeachdb '
IF DB_ID(''?'') > 4
BEGIN
PRINT (''
ALTER DATABASE [?] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
DROP DATABASE [?]'')
END
'

13
投票

这是我对同一问题的解决方案:

-- drops all user databases
DECLARE @command nvarchar(max)
SET @command = ''

SELECT  @command = @command
+ 'ALTER DATABASE [' + [name] + ']  SET single_user with rollback immediate;'+CHAR(13)+CHAR(10)
+ 'DROP DATABASE [' + [name] +'];'+CHAR(13)+CHAR(10)
FROM  [master].[sys].[databases] 
 where [name] not in ( 'master', 'model', 'msdb', 'tempdb');

SELECT @command
EXECUTE sp_executesql @command

3
投票

这将终止所有连接,并删除列表中没有的所有数据库:

('master','tempdb','model','msdb','ReportServer','ReportServerTempDB')


use [master]

DECLARE 
@DATABASENAME nVARCHAR(20)

DECLARE
@TABLE TABLE
(NAME nVARCHAR(50))

Declare @SQL nvarchar(100)

INSERT INTO @TABLE

SELECT 
name 
FROM sys.databases 
WHERE name not in 
    ('master'
    ,'tempdb'
    ,'model'
    ,'msdb'
    ,'ReportServer'
    ,'ReportServerTempDB')


while (select COUNT(*) from @table) > 0

begin

select @DATABASENAME = (select top 1 (name) from @TABLE)

DECLARE @kill varchar(8000) = '';
SELECT @kill = @kill + 'kill ' + CONVERT(varchar(5), spid) + ';'
FROM master..sysprocesses 
WHERE dbid = db_id(@DATABASENAME)

EXEC(@kill);

set @SQL = 'drop database ' + @DATABASENAME

exec sp_executesql @SQL, N'@databasename nvarchar(50)', @databasename; 

print @databasename + ' has been deleted'

delete from @TABLE where NAME = @DATABASENAME

end

1
投票

这是我的PowerShell脚本版本。 DropAllDatabases.ps1

$sqlCmdPath="C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\110\Tools\Binn\sqlcmd.exe"
& $sqlCmdPath -S localhost -Q "EXEC sp_MSforeachdb 'IF DB_ID(''?'') > 4 BEGIN PRINT ''?'' ALTER DATABASE [?] SET SINGLE_USER WITH ROLLBACK IMMEDIATE DROP DATABASE [?] END'"

注意:您可能需要将$ sqlCmdPath更新为您的SQL版本。


1
投票

我遇到了我的数据库问题,上面的解决方案无法正常工作。

我只是想删除我的所有数据库,但我的名字有问题。实际上,我的数据库名称如下:

093e83d-somename;
39s2ak3-anothername;

删除这些数据库(在MariaDB上测试)的更简单方法是执行以下命令:

DROP DATABASE `093e83d-somename`;

当我们直接想要从bash文件执行SQL命令时,这种名称似乎是一个问题,因为我们必须在后引号(``)之间指定数据库的名称。

如果您遇到同样的问题,并且您拥有大量数据库,则只需创建一个包含所需命令的批处理脚本,然后在SQL Server中执行此命令。

test.sh示例:

#!/bin/bash

# Informations needed
MUSER="root"
MPASS="pass"

# We get the needed binaries
MYSQL=$(which mysql)
AWK=$(which awk)
GREP=$(which grep)

# We get all the DB names in DB
DB=$($MYSQL -u $MUSER -p$MPASS -e 'show databases' | $AWK '{ print $1}' | $GREP -v '^Databases' )

# For each database, we write the drop command in the file test.sql
for t in $DB
do
    echo -e "DROP DATABASE \`$t\`;" >> test.sql
done

# We execute the created SQL file with all the DROP commands
$MYSQL -u $MUSER -p$MPASS -e 'source test.sql;'

# We finally delete the created file.
rm test.sql

我认为这个脚本适用于所有情况。希望这有帮助。


0
投票

我使用了Pellared提供的答案并略微修改了它。

-- drops all user databases
DECLARE @command nvarchar(max)
SET @command = ''

SELECT  @command = @command
+ 'ALTER DATABASE [' + [name] + ']  SET single_user with rollback immediate;'+CHAR(13)+CHAR(10)
+ 'DROP DATABASE [' + [name] +'];'+CHAR(13)+CHAR(10)
FROM  [master].[sys].[databases] 
where [name] like 'DBName%';

-- PRINT @COMMAND
EXECUTE sp_executesql @command

0
投票

而MartinSmith的答案是正确的解决方案。我发现删除对象窗口只是处于“进行中”状态,同时删除了许多数据库中的第一个。这是由于一个过度生长的msdb备份历史记录,该历史记录试图通过选中“删除数据库的备份和还原历史记录信息”选项进行清理。

有关清理备份历史记录1 2的详细信息,请参阅这些链接

添加here提供的索引后,删除在合理的时间内处理。


0
投票

您可以像这样使用Cursor:

DECLARE @DBName VARCHAR (64)
DECLARE @SQL VARCHAR (255)

DECLARE DROPDB CURSOR FOR 
SELECT name FROM sys.databases
WHERE name NOT IN ('master','model','msdb','tempdb','distribution','ReportServer','ReportServerTempDB')

OPEN DROPDB
FETCH next FROM DROPDB INTO @DBName
WHILE @@FETCH_STATUS = 0

BEGIN
    SET @SQL = 'DROP DATABASE ' + @DBName
    PRINT @SQL
    EXEC @SQL
    FETCH next FROM DROPDB INTO @DBName
END

CLOSE DROPDB
DEALLOCATE DROPDB

在我的博客中更多地是关于这个主题。 www.pigeonsql.com


0
投票

使用T-SQL删除(删除)MS-SQL中所有数据库的安全方法是排除所有系统数据库和您要保留的任何其他数据库,以及特殊数据库,如数据仓库数据库“DW”,报告服务器数据库

排除我们要保留的所有数据库(包括所有系统数据库),可以安全地删除我们不想保留的所有其他数据库。

例如:

use master
go
declare @dbnames nvarchar(max)
declare @statement nvarchar(max)
set @dbnames = ''
set @statement = ''
select @dbnames = @dbnames + ',[' + name + ']' from sys.databases 
    where name 
    NOT IN ('master','model','msdb','tempdb') 
    AND name NOT LIKE '%AdventureWorks%' -- Database to keep 
    AND name NOT LIKE '%DW%' -- Data warehouse database
    AND name NOT LIKE '%ReportServer%' -- Report server database
if len(@dbnames) = 0
    begin
    print 'no databases to drop'
    end
else
    begin
    set @statement = 'drop database ' + substring(@dbnames, 2, len(@dbnames))
    print @statement
    exec sp_executesql @statement
    end
go
© www.soinside.com 2019 - 2024. All rights reserved.