2015-09-28 60 views
0

我正在測試對於以特定前綴開頭的所有數據庫的drop database查詢。然而,因爲這很容易導致可怕的事情,我把我的降數據庫查詢將應用於每個SQL Server數據庫的查詢

declare @dbname nvarchar (200); 
declare @query nvarchar (max); 

DECLARE db_cursor CURSOR FOR 
select name from sys.databases 
where name like 'PREFIX%' 

Open db_cursor 
fetch next from db_cursor into @dbname 

while @@FETCH_STATUS = 0 

BEGIN 
    set @query = 'Drop Database ['+ @dbname + ']' 
    Exec(@query) 

    FETCH NEXT FROM db_cursor INTO @dbname 

END 
Close db_cursor 
deallocate db_cursor 

,並想改變Drop Database部分的東西是那麼可怕。

所以主要問題是否有一個簡單的SQL查詢,我可以放在那裏,總是適用於任何SQL Server數據庫?所以我知道這個查詢只會影響我想要的數據庫,然後再將它切換回Drop Database

編輯:更好的是,一個查詢將返回數據庫的名稱。 與select name from sys.databases類似,但與['+ @dbname + ']一起使用的僅返回具有該前綴的數據庫的名稱,以確保此查詢影響相應的數據庫。

+0

使用的數據庫都將適用。但我不知道它會如何幫助 – lazy

+0

@lazy請參閱編輯我製作 – David

+0

爲什麼你覺得在這裏需要使用光標? – Becuzz

回答

2

首先只需要執行以下查詢,它會告訴你什麼樣的數據庫將它提出的代碼的其餘部分

select name from sys.databases 
where name like 'PREFIX%' 

最後補充一個PRINT語句來看看最終的在遊標內動態構建DROP DATABASE語句。

代碼中的一些小的改進:

declare @dbname SYSNAME; 
declare @query nvarchar (max); 

DECLARE db_cursor CURSOR LOCAL FORWARD_ONLY FOR 
select name from sys.databases 
where name like 'PREFIX%' 

Open db_cursor 
fetch next from db_cursor into @dbname 

while (@@FETCH_STATUS = 0) 
BEGIN 

    set @query = 'Drop Database '+ QUOTENAME(@dbname) 

    --Exec sp_executesql @query  --<-- For execution 
    -- PRINT @query     --<-- For debugging 
    FETCH NEXT FROM db_cursor INTO @dbname 

END 
Close db_cursor 

deallocate db_cursor