从服务器删除所有数据库

时间:2011-04-25 10:31:02

标签: sql sql-server sql-server-2005

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

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

9 个答案:

答案 0 :(得分: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
'

答案 1 :(得分:14)

这是我解决同样问题的方法:

-- 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

答案 2 :(得分: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

答案 3 :(得分: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版本。

答案 4 :(得分:1)

我遇到了数据库问题,上面的解决方案无效。

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

093e83d-somename;
39s2ak3-anothername;

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

DROP DATABASE `093e83d-somename`;

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

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

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

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

答案 5 :(得分: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

答案 6 :(得分:0)

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

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

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

答案 7 :(得分: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

答案 8 :(得分:0)

使用T-SQL删除(删除)MS-SQL中所有数据库的安全方法是排除所有系统数据库,以及要保留的任何其他数据库,以及特殊数据库,如数据仓库数据库和#34; 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