web-dev-qa-db-ja.com

機能していないデータベースを除くすべてのデータベースを削除するスクリプト

テストサーバーに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'. 

ここでどこを修正すればよいですか?
ありがとうございました

3

これを試してみませんか?

DECLARE @cmd1 nvarchar(2000)
SET @cmd1 = 'IF ''?'' NOT IN(''Name of your database'')' + 'BEGIN ' 
+ 'drop DATABASE [?] ' 
+ 'END' 
EXEC sp_MSForEachdb 
@command1 = @cmd1 
GO

ここで機能しました。

マスターやその他を落とさないように注意を払ってください。そのリストに入れてください。

3
Racer SQL

以下のようなものはどうですか:

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
4
Kin Shah

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
3