2014-11-21 71 views
0

我有,我已經納入一個批處理文件,應通過另一個進程將重新創建並再次填充數據庫運行之前自動刪除數據庫的查詢。我用這個查詢巴吉查詢刪除數據庫

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

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

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 

問題是它沒有刪除所有東西。來自每次運行的結果將填充另一個表,當我運行後續運行時,我將獲得當前運行中先前運行的結果。 Anyboyd查看如何設置此查詢的錯誤?

+0

嘗試添加一些'BEGIN TRY .. BEGIN CATCH..'代碼來捕獲和報告任何錯誤。 – RBarryYoung 2014-11-21 17:12:26

+0

不是問題,但: EXEC sp_executesql的@query http://technet.microsoft.com/en-us/library/ms175170(v=sql.105).aspx – 2014-11-21 17:21:02

+0

這是否查詢返回從SYS任何結果'選擇名稱。數據庫的名字像'%ABCDir%'? – 2014-11-21 17:26:45

回答

0

該腳本將確保您連接到數據庫,然後更改數據庫模式爲單用戶,這意味着只有一個用戶可以連接到數據庫,然後將連接到主數據庫就會留下數據庫被丟棄沒有連接,最後你可以刪除數據庫。

還可以使用適當的數據類型,你的數據庫絕不會2000個字符那麼爲什麼要使用一個變量,VARCHAR 2000年,使用特定的存儲SQL Server的對象名SYSNAME數據類型。

使用QUOTENAME()函數把方括號你的數據庫名稱。使您的代碼看起來更乾淨,並保護您免受可能的SQL注入攻擊。

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

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

Open db_cursor 
fetch next from db_cursor into @dbname 

WHILE (@@FETCH_STATUS = 0) 
BEGIN 
    SET @query = N' USE ' + QUOTENAME(@dbname) 
       + N' ALTER DATABASE ' + QUOTENAME(@dbname) 
       + N' SET SINGLE_USER WITH ROLLBACK IMMEDIATE; ' 
       + N' USE master;' 
       + N' Drop Database ' + QUOTENAME(@dbname) + '' 

    EXEC sp_executesql @query 

    FETCH NEXT FROM db_cursor INTO @dbname 

END 

Close db_cursor 
deallocate db_cursor