我有一个应用程序为每个新客户创建一个单独的数据库(SQL Server 2008),在测试期间我们最终得到了许多名为PREFIX.whatever ...的数据库。
我希望能找到一个以PREFIX开头的所有数据库的脚本。放下它们,这样我们就可以开始一个干净的测试循环。任何帮助非常感谢。
答案 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
声明留为注释,目的是为了避免有人通过复制/粘贴来这样做。