2012-08-06 46 views
3

我在SQL Server 2008 R2的數據庫,我創建了恢復數據庫此存儲過程:還原存儲過程

CREATE PROCEDURE [dbo].[usp_DBRestore] 
@DBName nvarchar(60) 
,@BackName nvarchar(120) 
,@OutMessage nvarchar(4000) output 
--, 
[email protected] varchar(60), 
[email protected] varchar(120), 
[email protected] varchar(60), 
[email protected] varchar(120) 
AS 

BEGIN TRY 
    USE [master] 

    ALTER DATABASE @DBName SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
    RESTORE DATABASE @DBName FROM 
     DISK = @BackName WITH 
     FILE = 1, NOUNLOAD, 
     REPLACE, 
     PASSWORD = 'TEST' 
    SET @OutMessage = 'OK'; 
    ALTER DATABASE @DBName SET MULTI_USER WITH ROLLBACK IMMEDIATE 
END TRY 
BEGIN CATCH 

    ALTER DATABASE @DBName SET MULTI_USER WITH ROLLBACK IMMEDIATE 

    INSERT [dbo].[ErrorLog] 
    (
    [UserName], 
    [ErrorNumber], 
    [ErrorSeverity], 
    [ErrorState], 
    [ErrorProcedure], 
    [ErrorLine], 
    [ErrorMessage] 
    ) 
    VALUES(
      CONVERT(sysname, CURRENT_USER), 
      ERROR_NUMBER(), 
      ERROR_SEVERITY(), 
      ERROR_STATE(), 
      ERROR_PROCEDURE(), 
      ERROR_LINE(), 
      ERROR_MESSAGE() 

     ) 
END CATCH 

當我執行的代碼,我看到這個錯誤:

一個USE數據庫聲明不允許在程序,函數或觸發器中使用。

我該如何解決這個錯誤?

+2

**不要在您的存儲過程中擁有'USE ...'......這實際上只是**解決方案。爲什麼在存儲過程中需要這個?你不能把它作爲一個獨立的查詢嗎? (這就是我所做的) – 2012-08-06 09:38:56

+3

即使你的數據庫中沒有'USE master',這個'ALTER DATABASE @ DBName'也不起作用,因爲你不能指定數據庫名作爲參數。 .. – 2012-08-06 09:40:13

回答

0

您不需要USE語句。最好的辦法是刪除使用語句,並在master數據庫本身上創建/更改此sp。

如果要進行備份,請從主數據庫執行此SP。我看不到任何其他出路。

1

你不能以這種方式做到這一點 - 你基本上有兩種選擇:

  1. 棒存儲過程,但在這種情況下,你必須使用動態SQL。您的存儲過程將創建一串SQL語句,允許其使用USE master,並允許它動態設置數據庫名稱等,然後使用sp_executesql @sqlRestoreStatement執行該SQL語句。如果你想看看這個,你MUST是一切手段閱讀(和理解)厄蘭Sommarskog的開創性文章The Curse and Blessings of Dynamic SQL

  2. 可以使用常規的SQL腳本,可能與SQLCMD佔位符(如果你有SQLCMD mode在啓用了SQL Server Management Studio),並從常規腳本執行還原(例如,您可以將其放入自己的模板文件夾中)。在這種情況下,你會碰到這樣的:

    :setvar dbname YourDatabaseNameHere 
    
    DECLARE @FileName NVARCHAR(255) 
    SET @FileName = N'D:\YourBackupDirectory\SomeDatabase.bak' 
    
    RESTORE DATABASE [$(dbname)] 
    FROM DISK = @FileName 
    WITH FILE = 1, 
    MOVE N'YourDatabase_Data' TO N'D:\MSSQL\Data\$(dbname).mdf', 
    MOVE N'YourDatbase_Log' TO N'D:\MSSQL\Data\$(dbname)_Log.ldf', 
    NOUNLOAD, REPLACE, 
    STATS = 2 
    GO 
    

    有了這個設置,您可以方便地使用SQL腳本作爲模板,恢復使用任何一種數據庫。

0

你爲什麼不保存在master數據庫中該存儲過程?這對你來說會是一個問題嗎?