2014-07-26 86 views
1

是否存在刪除/刪除沒有表的數據庫的查詢(刪除空數據庫)?刪除沒有表的數據庫

服務器是Microsoft SQL Server 2005的

+0

Sql Shell將是我的選擇。 – stckl0ve

+0

請參閱http://dba.stackexchange.com/questions/47726/how-to-query-a-database-for-empty-tables。然後刪除名稱返回的表。 – scrayne

+1

@DanRitchie那真的不是OP要找的東西....我們正在談論數據庫,而不是表格。 –

回答

1

這應該做到這一點。 在實驗室機器上進行測試,並使用0個用戶表刪除所有數據庫。 但是請注意,表格不一定是數據庫中唯一的東西。可能存在有人可能仍然需要的存儲過程,函數等。

注意這是一個非常危險的操作,因爲它丟棄數據庫。自擔風險使用。我對您造成的損害不承擔任何責任。

USE [master]; 
DECLARE @name varchar(50); 
DECLARE @innerQuery varchar(max); 
DECLARE tableCursor CURSOR FOR SELECT name FROM sys.databases where owner_sid != 0x01; 
OPEN tableCursor; 

FETCH NEXT FROM tableCursor 
INTO @name 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @innerQuery = 'USE [' + @name + ']; IF (SELECT COUNT(*) FROM sys.objects WHERE type = ''U'') = 0 
    BEGIN 
     USE [master]; 
     DROP DATABASE [' + @name + '] 
    END' 
    EXEC(@innerQuery) 
    FETCH NEXT FROM tableCursor INTO @name 
END 

CLOSE tableCursor; 
DEALLOCATE tableCursor; 

另請注意,如果正在使用數據庫,SQL Server將拒絕將其刪除。所以,如果有其他連接到特定的數據庫,它試圖放棄,該命令將中止。

爲了避免這個問題,您可以將有問題的數據庫設置爲單用戶模式。

以下腳本與上述相同,但它也將目標數據庫設置爲單用戶模式以終止活動連接。 更加小心,因爲它本質上'S核選擇:

use [master]; 
DECLARE @name varchar(50); 
DECLARE @innerQuery varchar(max); 
DECLARE tableCursor CURSOR FOR SELECT name FROM sys.databases where owner_sid != 0x01; 
OPEN tableCursor; 

FETCH NEXT FROM tableCursor 
INTO @name 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @innerQuery = 
    'USE [' + @name + ']; 
    IF (SELECT COUNT(*) FROM sys.objects WHERE type = ''U'') = 0 
    BEGIN 
     USE [master]; 
     ALTER DATABASE [' + @name + '] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; 
     DROP DATABASE [' + @name + ']; 
    END' 
    EXEC(@innerQuery) 
    FETCH NEXT FROM tableCursor INTO @name 
END 

CLOSE tableCursor; 
DEALLOCATE tableCursor; 
0

我認爲這是不可能的(至少不是一個TSQL的命令,可能是一個存儲過程的地方)。您必須查詢sysobjects並在發現任何情況下中止。 (並且您必須決定是否要忽略某些系統對象,如設計表)。

0

下面的腳本將生成所需的DROP DATABASE腳本。你可以調整它來執行語句(在主數據庫上下文中),但我建議你先檢查它以防萬一。

EXEC sp_MSforeachdb N' 
    USE [?]; 
    IF N''?'' NOT IN(N''master'', N''model'', N''msdb'', N''tempdb'') 
    BEGIN 
     IF NOT EXISTS(
      SELECT * 
      FROM sys.tables 
      WHERE 
       OBJECTPROPERTYEX(object_id, ''IsMSShipped'') = 0 
      ) 
     BEGIN 
      PRINT ''DROP DATABASE [?];''; 
     END; 
    END;';