遍历所有非系统数据库并清空它们

Kar*_*ren 3 sql-server

在 SQL Server 2012 上......我在用于培训目的的服务器上有多个数据库。这些需要定期清除以重新开始。当数据库数量很少时,我会使用 Adam Anderson 的代码删除所有对象并手动更改 USE 语句。现在有 200 多个数据库,我宁愿不要。希望自动化这个过程。我正在尝试使用 sp_MSforeachdb,但到目前为止还没有运气。有什么建议?提前致谢!

DECLARE @command nvarchar(max) 

SELECT @command ='IF EXISTS 
(
    SELECT 1
    FROM sys.databases
    WHERE name = ''?'' 
    AND name LIKE ''learndb%''        --we have learndb1, learndb2, etc...
)
BEGIN

DECLARE @stmt nvarchar(max)
DECLARE @n char(1)
SET @n = char(10)

select @stmt = isnull( @stmt + @n, '''' ) +
    ''drop procedure ['' + schema_name(schema_id) + ''].['' + name + '']''
from sys.procedures

select @stmt = isnull( @stmt + @n, '''' ) +
''alter table ['' + schema_name(schema_id) + ''].['' + object_name( parent_object_id ) + '']    drop constraint ['' + name + '']''
from sys.check_constraints

select @stmt = isnull( @stmt + @n, '''' ) +
    ''drop function ['' + schema_name(schema_id) + ''].['' + name + '']''
from sys.objects
where type in ( ''FN'', ''IF'', ''TF'' )

select @stmt = isnull( @stmt + @n, '''' ) +
    ''drop view ['' + schema_name(schema_id) + ''].['' + name + '']''
from sys.views

select @stmt = isnull( @stmt + @n, '''' ) +
    ''alter table ['' + schema_name(schema_id) + ''].['' + object_name( parent_object_id ) + ''] drop constraint ['' + name + '']''
from sys.foreign_keys

select @stmt = isnull( @stmt + @n, '''' ) +
    ''drop table ['' + schema_name(schema_id) + ''].['' + name + '']''
from sys.tables

select @stmt = isnull( @stmt + @n, '''' ) +
    ''drop type ['' + schema_name(schema_id) + ''].['' + name + '']''
from sys.types
where is_user_defined = 1

select @stmt = isnull( @stmt + @n, '''') +
    ''drop trigger ['' + schema_name(schema_id) + ''].['' + name + '']''
from sys.objects
where type = ''TF'' exec sp_executesql @stmt END'

EXEC sp_MSforeachdb @command 
Run Code Online (Sandbox Code Playgroud)

Kin*_*hah 5

尝试使用sp_MSforeachdb - Aaron 的版本

这比无证的 sp_MSforeachdb.

此外,如果您可以从头开始重新创建数据库(如上面的 Aaron 建议),则更合理,请确保您具有Instant File initialization - Enabled


Aar*_*and 5

我认为更简单的方法是删除所有数据库并将它们重新创建为空:

USE [master];
GO

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += N'
ALTER DATABASE ' + QUOTENAME(name) 
  + ' SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
  DROP DATABASE ' + QUOTENAME(name) + ';
  CREATE DATABASE ' + QUOTENAME(name) + ';'
FROM sys.databases 
WHERE name LIKE N'learndb%';

PRINT @sql;
-- EXEC sp_executesql @sql; 
Run Code Online (Sandbox Code Playgroud)

如果每个数据库都需要一个用户或一组用户,则只需将该用户添加到model数据库中即可。