32

明確にするために、これは実際には質問ではなく、答えを探していた私のような人々のためのより多くの助けです。
多くのアプリケーションが一時テーブルなどを作成しますが、TeamFoundationServerがテストSQLServerで80以上のデータベースを作成したときに驚きました。TFSが正しくインストールされなかったので、親切にもそれを片付けてくれました。各データベースには名前の規則があるため、各データベースを手動で削除するのではなく、カーソルの使用方法を思い出し、これまでで最も賢明でないT-SQLと見なすものを記述しました。

   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;

言うまでもなく、このようなカーソルの使用はおそらく非常に危険であり、細心の注意を払って使用する必要があります。これは私にとってはうまくいき、データベースへのさらなる損傷はまだ見られませんが、私は否認します。このコードは自己責任で使用し、最初に重要なデータをバックアップしてください。
また、これが問題ではないので削除する必要がある場合は、理解しています。人々が見るだろうどこかにこれを投稿したかっただけです。

4

3 に答える 3

72

代わりにこれを実行しないのはなぜですか?

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

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

「ハンマーを持っていると、すべてが釘のように見えます!」..

于 2011-02-25T16:41:19.973 に答える
37

これは簡単...

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
于 2012-01-09T16:18:59.377 に答える
0

カーソルを使用する必要はなく、SQLステートメントをコピーして貼り付ける必要もありません。次の2行を実行するだけです。

DECLARE @Sql as NVARCHAR(MAX)=(SELECT'DROP DATABASE ['+ name +'];' FROM sys.databases WHERE name LIKE'DBName%' FOR XML PATH(''))

EXEC sys.sp_executesql @Sql

もちろん、基準に一致するDBはすぐに削除されるため、何をしているかを確認してください。

于 2019-07-31T04:58:04.630 に答える