2011-02-25 18 views
17

明確にするために、実際には質問ではなく、答えを探していた私のような人にはもっと助けてください。
多くのアプリケーションで一時テーブルなどが作成されていますが、テスト用SQL ServerにTeam Foundation Serverが80以上のデータベースを作成したときに驚きました。 TFSは正しくインストールされなかったし、親切に私の後にそれをクリアするために私を残しました。各データベースは、手で各データベースを削除するのではなく、命名規則を持っていたので、私は、カーソルを使用する方法を思い出し、私が今までT-SQLの最も賢明作品であることを確認何書かれています:複数のデータベースをSQL Serverにドロップする方法

CREATE TABLE #databaseNames (name varchar(100) NOT NULL, db_size varchar(50), owner varchar(50), dbid int, created date, status text, compatibility_level int); 
INSERT #databaseNames 
    exec sp_helpdb; 

DECLARE dropCur CURSOR FOR 
    SELECT name FROM #databaseNames WHERE name like '_database_name_%'; 
OPEN dropCur; 
DECLARE @dbName nvarchar(100); 
FETCH NEXT FROM dropCur INTO @dbName; 
DECLARE @statement nvarchar(200); 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @statement = 'DROP DATABASE ' + @dbName; 
    EXEC sp_executesql @statement; 
    FETCH NEXT FROM dropCur INTO @dbName; 
END 
CLOSE dropCur; 
DEALLOCATE dropCur; 
DROP TABLE #databaseNames; 

それはなしで行きますこのようなカーソルを使用することはおそらく本当に危険であり、非常に注意して使用すべきだと言っています。これは私にとってはうまくいっていますが、私のデータベースにはまだそれ以上のダメージはありませんでしたが、私は責任を負いません。
また、これが問題ではないので削除する必要がある場合は、わかります。ちょうど人々が見るだろうどこかにこれを投稿したかった。

+1

それは良いかもしれないので、あなたは、あなた自身の質問に答えることを許可されています実際の質問に質問を書き直してください(あなたの特定の苦境とそれに当てはまる一般的な問題の両方に挑戦してください)。そして、スクリプトを回答として投稿してください。 –

答えて

20

これは簡単です...

use master 
go 
declare @dbnames nvarchar(max) 
declare @statement nvarchar(max) 
set @dbnames = '' 
set @statement = '' 
select @dbnames = @dbnames + ',[' + name + ']' from sys.databases where name like 'name.of.db%' 
if len(@dbnames) = 0 
    begin 
    print 'no databases to drop' 
    end 
else 
    begin 
    set @statement = 'drop database ' + substring(@dbnames, 2, len(@dbnames)) 
    print @statement 
    exec sp_executesql @statement 
    end 
+0

悪くない!私はこれをもう一度やる必要があるなら、これを念頭に置いておきます! :) – Gargravarr

+0

小さな修正、len(@dbnames)の比較は0にする必要があります。それをテストし、それは素晴らしい動作します。 like節のパターンをデータベースの名前に置き換えてください。 –

+0

ありがとう、コードを修正しました:) – SeriousM

45

代わりにこれを行うのはなぜですか。

USE master; 
Go 
SELECT 'DROP DATABASE '+ name 
FROM sys.databases WHERE name like '_database_name_%'; 
GO 

結果セットの出力をキャプチャし、別のクエリウィンドウに貼り付けます。その後、それを実行します。なぜ、このTSQLカーソルコードをすべて記述しますか?

「あなたはハンマーを持っている場合は、すべてが釘のように見えます!」..

+2

これは、データベースを手動で削除するための素晴らしいソリューションです。私はテスト中に生成されたデータベースをたくさん持っており、テストの実行を中止すると、通常は10〜20個のデータベースで終了します。この出力を生成することで、何が落とされるのかを簡単に見直すことができます。出力を 'SELECT 'DROP DATABASE [' + name + ']''に変更して、db名の特殊文字を考慮に入れることを提案しました。これは私がする必要のある修正です。 – nohwnd

+0

この問題は、削除する前に接続を閉じないと、完了した接続を気にしなくても、削除に時間がかかることがあります。 – Tarik

+0

私もこれを借ります。「ハンマーを持っていると、すべてが爪のように見えます!」「 –

関連する問題