3

我在 SQL Server 2008 R2 中有一个数据库,我创建了这个用于恢复数据库的存储过程:

CREATE PROCEDURE [dbo].[usp_DBRestore]
@DBName nvarchar(60)
,@BackName nvarchar(120)
,@OutMessage nvarchar(4000) output
--,
--@DataName varchar(60),
--@DataFileName varchar(120),
--@LogName varchar(60),
--@LogFileName 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 数据库语句。

我该如何解决这个错误?

4

3 回答 3

1

你不能那样做——你基本上有两个选择:

  1. 坚持使用存储过程,但在这种情况下,您必须使用动态 SQL。您的存储过程创建了一个 SQL 语句字符串,它允许它使用USE master并允许它动态设置数据库名称等,然后它使用sp_executesql @sqlRestoreStatement. 如果你想看看这个,你必须阅读(并理解)Erland Sommarskog 的开创性文章动态 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 脚本用作模板并使用它恢复任何类型的数据库。

于 2012-08-06T10:00:54.417 回答
0

您可以创建一个链接服务器并在您的存储过程中引用它。例如。LinkedServer.database.[dbo].StoredProcedure

查看此 如何为 SQL Server 2008 创建链接服务器,其中我们拥有 2000 年和 2005 年的数据库

于 2013-10-18T15:54:16.873 回答
0

您不需要 USE 语句。最好是删除 Use 语句并在主数据库本身上创建/更改此 sp。

如果要进行备份,请从主数据库执行此 SP。我看不到任何其他出路。

于 2012-08-06T09:43:31.790 回答