在 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)
尝试使用sp_MSforeachdb - Aaron 的版本。
这比无证的 sp_MSforeachdb.
此外,如果您可以从头开始重新创建数据库(如上面的 Aaron 建议),则更合理,请确保您具有Instant File initialization - Enabled。
我认为更简单的方法是删除所有数据库并将它们重新创建为空:
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数据库中即可。