【问题标题】:How to drop multiple databases in SQL Server如何在 SQL Server 中删除多个数据库
【发布时间】:2011-07-04 05:31:57
【问题描述】:

只是澄清一下,这不是一个真正的问题,更多的是对像我这样正在寻找答案的人的帮助。
许多应用程序创建临时表等,但当 Team Foundation Server 在我的测试 SQL Server 上创建 80 多个数据库时,我感到很惊讶。 TFS 没有正确安装,请让我在它之后进行清理。由于每个数据库都有一个命名约定,而不是手动删除每个数据库,我记得如何使用游标并编写了我认为是有史以来最不明智的 T-SQL 部分:

   CREATE TABLE #databaseNames (name varchar(100) NOT NULL, db_size varchar(50), owner varchar(50), dbid int, created date, status text, compatibility_level int);
INSERT #databaseNames
    exec sp_helpdb;

DECLARE dropCur CURSOR FOR
    SELECT name FROM #databaseNames WHERE name like '_database_name_%';
OPEN dropCur;
DECLARE @dbName nvarchar(100);
FETCH NEXT FROM dropCur INTO @dbName;
DECLARE @statement nvarchar(200);
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @statement = 'DROP DATABASE ' + @dbName;
    EXEC sp_executesql @statement;
    FETCH NEXT FROM dropCur INTO @dbName;
END
CLOSE dropCur;
DEALLOCATE dropCur;
DROP TABLE #databaseNames;

不用说,使用这样的游标可能真的很危险,应该非常小心地使用。这对我有用,我还没有看到我的数据库有任何进一步的损坏,但我声明:使用此代码需要您自担风险,并首先备份您的重要数据!
另外,如果因为这不是问题而应该删除它,我理解。只是想把这个贴在人们会看的地方。

【问题讨论】:

  • 您可以回答自己的问题,因此最好将问题重写为实际问题(尝试根据您的特定困境和一般问题来表述它适合),然后发布脚本作为答案。

标签: database tsql sql-drop


【解决方案1】:

为什么不直接这样做呢?

USE master;
Go
SELECT 'DROP DATABASE ['+ name + ']' 
FROM sys.databases WHERE name like '_database_name_%';
GO

捕获该结果集的输出,然后将其粘贴到另一个查询窗口中。然后运行它。为什么要编写所有这些 TSQL 游标代码?

“当你有一把锤子时,一切看起来都像钉子!”..

【讨论】:

  • 这是手动删除数据库的绝佳解决方案。我在测试期间生成了很多数据库,当我中止测试运行时,我通常会得到 10-20 个数据库。生成此输出使我能够轻松查看将要删除的内容。我只建议将输出修改为 SELECT 'DROP DATABASE ['+ name +']' 以考虑数据库名称中的特殊字符,这是我需要做的修复。
  • 这样做的问题是,如果你在删除之前不关闭连接,即使你可能不关心已完成的连接,删除也可能需要一段时间。
  • 这个我也借,"When you have a hammer, everything looks like a nail!"..
【解决方案2】:

这很简单……

use master
go
declare @dbnames nvarchar(max)
declare @statement nvarchar(max)
set @dbnames = ''
set @statement = ''
select @dbnames = @dbnames + ',[' + name + ']' from sys.databases where name like 'name.of.db%'
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

【讨论】:

  • 不错!如果我必须再次这样做,我会记住这一点! :)
  • 小修正,len(@dbnames) 比较应该是 = 0。经过测试,效果很好。只需将 like 子句中的模式替换为您的数据库名称
【解决方案3】:

无需使用游标,也无需复制粘贴 SQL 语句。只需运行这两行:

DECLARE @Sql as NVARCHAR(MAX) = (SELECT 'DROP DATABASE ['+ name + '];' FROM sys.databases WHERE name LIKE 'DBName%' FOR XML PATH(''))

EXEC sys.sp_executesql @Sql

当然,任何符合条件的数据库都会被立即删除,因此请确保您知道自己在做什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-03
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    相关资源
    最近更新 更多