2013-10-08 25 views
0

我寫一個簡單的程序來收縮數據庫日誌,只需要輸入數據庫名稱:的簡單程序來收縮數據庫日誌錯誤

ALTER proc [dbo].[sp_shrinkDBAndDBLog] 
      @databaseName nvarchar(100) 
     as 
     begin 

     declare @logName nvarchar(100), 
       @dynamicSQL nvarchar(500) 

     set @dynamicSQL='ALTER DATABASE '[email protected]+' SET RECOVERY SIMPLE WITH NO_WAIT'  

     exec(@dynamicSQL) 

     --select name from HLJEDI_SYS.sys.sysfiles where groupid=0;   

     set @dynamicSQL=N'select @logName= name from '[email protected]+'.sys.database_files where type_desc=''LOG''' 

     exec sp_executesql @dynamicSQL,N'@logName nvarchar(100) output',@logName output   

     --select * from sys.sysfiles where groupid=0      

     set @dynamicSQL='DBCC SHRINKFILE (N'''[email protected]+''',11,TRUNCATEONLY)' 

     exec(@dynamicSQL) 

     --DBCC SHRINKFILE (N'CUC_OA_LOG' , 11, TRUNCATEONLY)   


     set @dynamicSQL='ALTER DATABASE '[email protected]+' SET RECOVERY FULL WITH NO_WAIT'  

     exec(@dynamicSQL) 
     --ALTER DATABASE OA SET RECOVERY FULL --(Restore to Full Schema)  
    end 

,但是當我執行與:

exec sp_shrinkDBAndDBLog 'DBName' 

它有錯誤: sys.database_files找不到數據庫'主'文件'eca2_log'。該文件已被刪除,不存在。

問題是什麼?謝謝你,如果你告訴我,並顯示細節和princeple。

+0

備註:您應該**不要**爲存儲過程使用'sp_'前綴。微軟已經保留了這個前綴以供自己使用(參見*命名存儲過程*)](http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx),以及你將來有可能冒着名字衝突的風險。 [這對你的存儲過程性能也是不利的](http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix)。最好只是簡單地避免使用'sp_'並將其他內容用作前綴 - 或者根本沒有前綴! –

回答

1

看起來您在執行DBCC SHRINKFILE命令之前可能會缺少USE {database}命令,因此DBCC未在正確的數據庫上執行。

+0

你能展示修復問題的實際代碼嗎? – frenchie

+0

使用@數據庫名稱 –

+0

該行必須緊接在以下行後面插入:set @ dynamicSQL ='DBCC SHRINKFILE(N'''+ @ logName +''',11,TRUNCATEONLY)' –