我有一个包含300多个数据库的服务器(SQL Server 2005)。我不想一个一个地右键单击并选择Delete
。
如何轻松删除所有数据库?
答案 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备份历史记录,该历史记录试图通过选中“删除数据库的备份和恢复历史记录信息”选项进行清理。
添加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