テストサーバーに1つを除くすべてのデータベースを削除しようとしています。このため、以下のスクリプトを使用していますが、エラーが発生します。
EXEC sp_MSforeachdb
'
USE [?]
IF (DB_ID(''?'') > 4 AND DB_NAME()!=''ABC'')
BEGIN
ALTER DATABASE ''?'' SET SINGLE_USER WITH ROLLBACK IMMEDIATE
DROP DATABASE ''?''
END
'
エラーメッセージは次のとおりです。
Msg 102, Level 15, State 1, Line 5
Incorrect syntax near 'master'.
Msg 102, Level 15, State 1, Line 5
Incorrect syntax near 'IMMEDIATE'.
Msg 102, Level 15, State 1, Line 5
Incorrect syntax near 'tempdb'.
Msg 102, Level 15, State 1, Line 5
Incorrect syntax near 'IMMEDIATE'.
Msg 102, Level 15, State 1, Line 5
Incorrect syntax near 'model'.
Msg 102, Level 15, State 1, Line 5
Incorrect syntax near 'IMMEDIATE'.
Msg 102, Level 15, State 1, Line 5
Incorrect syntax near 'msdb'.
Msg 102, Level 15, State 1, Line 5
Incorrect syntax near 'IMMEDIATE'.
Msg 102, Level 15, State 1, Line 5
Incorrect syntax near 'ABC'.
Msg 102, Level 15, State 1, Line 5
Incorrect syntax near 'IMMEDIATE'.
ここでどこを修正すればよいですか?
ありがとうございました
これを試してみませんか?
DECLARE @cmd1 nvarchar(2000)
SET @cmd1 = 'IF ''?'' NOT IN(''Name of your database'')' + 'BEGIN '
+ 'drop DATABASE [?] '
+ 'END'
EXEC sp_MSForEachdb
@command1 = @cmd1
GO
ここで機能しました。
マスターやその他を落とさないように注意を払ってください。そのリストに入れてください。
以下のようなものはどうですか:
sSMSの出力をテキストに変更し、問題がなければ、生成されたSQLステートメントを別のクエリウィンドウで実行します。
use master
go
select 'Alter database '+ quotename(name) + char(10) +'set single user with rollback immediate' +char(10)+ 'go'+ char(10)+ 'Drop database '+quotename(name) + char(10)+ 'go'
from sys.databases
where database_id > 4 -- exclude system databases
and name not in ('') -- exclude databases that you want to SAVE !!
pdate:以下は、SQLエージェントでも機能するスクリプトです...
/****************************************************************************************
Author : Kin Shah
written for dba.stackexchange.com
Purpose : Drop all the databases except system and user defined
Notes : 1. EXCLUDE databases name not in ('drop1','drop2','drop3')
2. Remove the commented ---exec (@sqltext) to ACTUALLY drop the databases
******************************************************************************************/
declare @dbname sysname
declare @sqltext nvarchar(max)
begin
select @dbname = min(name) from sys.databases where database_id > 4 and
name not in ('drop1','drop2','drop3') ---- CHANGE HERE FOR Databases that needs to be excluded !!
while @dbname is not null
begin
select @sqltext = 'ALTER DATABASE '+quotename(name)+' SET SINGLE_USER WITH ROLLBACK IMMEDIATE'
FROM sys.databases where name = ''+@dbname+''
select @sqltext = @sqltext+ char(10)+ 'DROP DATABASE '+QUOTENAME(name)+';' FROM sys.databases where name = ''+@dbname+''
print @sqltext
---exec (@sqltext)
select @dbname = min(name) from sys.databases where database_id > 4 and name > @dbnamename and
name not in ('drop1','drop2','drop3') ---- CHANGE HERE FOR Databases that needs to be excluded !!
end
end
Dbをsingleuserに設定した後、マスターに切り替える必要があります。 use masterステートメントを追加しましたが、これをテストしたくありません...
EXEC sp_MSforeachdb
'
USE [?]
IF (DB_ID(''?'') > 4 AND DB_NAME()!=''ABC'')
BEGIN
ALTER DATABASE ''?'' SET SINGLE_USER WITH ROLLBACK IMMEDIATE
**use master;**
DROP DATABASE ''?''
END