2011-02-25 47 views
17

只是爲了澄清,這不是一個真正的問題,對於像我這樣尋求答案的人來說,更多的幫助。
許多應用程序創建臨時表等,但是當Team Foundation Server在我的測試SQL 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 +']''來考慮數據庫名稱中的特殊字符,這是我需要做的一個修復。 – nohwnd

+0

問題是如果在刪除之前沒有關閉連接,即使您不關心已完成的連接,刪除操作也可能需要一段時間。 – Tarik

+0

我也會借用這個,''當你有一把錘子時,一切看起來都像個釘子!「# –

相關問題