使用通配符在SQL Server中删除数据库

时间:2010-06-23 12:06:13

标签: sql-server-2008

我有一个应用程序为每个新客户创建一个单独的数据库(SQL Server 2008),在测试期间我们最终得到了许多名为PREFIX.whatever ...的数据库。

我希望能找到一个以PREFIX开头的所有数据库的脚本。放下它们,这样我们就可以开始一个干净的测试循环。任何帮助非常感谢。

3 个答案:

答案 0 :(得分:13)

SELECT ' DROP DATABASE [' + NAME + ']' FROM sys.sysdatabases where name like 'PREFIX%'

复制输出并执行此操作以删除条件中的数据库。你也可以每天安排一下这个调整。

答案 1 :(得分:4)

更新

我们最终扩大了Baaju的答案,所以我想我会分享它。我们称之为来自MSBuild的脚本,它清除了测试期间创建的所有现有数据库:

use master

DECLARE @Name nvarchar(1000);

DECLARE testdb_cursor CURSOR FOR
SELECT 'ALTER DATABASE' + '[' + NAME + ']' + ' SET SINGLE_USER WITH ROLLBACK IMMEDIATE    DROP DATABASE ' + '[' + NAME + ']' FROM sys.sysdatabases where name like 'TCM.%'

OPEN testdb_cursor;

-- Perform the first fetch and store the value in a variable.
FETCH NEXT FROM testdb_cursor
INTO @Name;

-- Check @@FETCH_STATUS to see if there are any more rows to fetch.
WHILE @@FETCH_STATUS = 0
BEGIN

   -- Concatenate and display the current values in the variables.
   exec sp_executesql @Name;

   -- This is executed as long as the previous fetch succeeds.
   FETCH NEXT FROM testdb_cursor
   INTO @Name;
   END

CLOSE testdb_cursor;
DEALLOCATE testdb_cursor;

答案 2 :(得分:0)

刚遇到这个问题,并提出了一些细微的变化以允许在没有游标的情况下立即执行:

DECLARE @SQL NVARCHAR(MAX) = ''
SELECT @SQL = @SQL 
  + 'ALTER DATABASE [' + [name] + '] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; '
  + 'DROP DATABASE [' + [name] + ']; '
FROM sys.databases 
WHERE [name] like 'temp_%' AND create_date < DATEADD(day,-7,GETDATE())

-- display statements 
SELECT @SQL

-- execute (uncomment)
--EXEC sp_executesql @SQL 

上面删除了所有以"temp_"开始且早于7天的数据库,但这显然可以适应任何情况。

危险:弄乱您的查询,删除部分或全部数据库。我将EXEC声明留为注释,目的是为了避免有人通过复制/粘贴来这样做。