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

その方法ではこれを行うことはできません - 基本的に 2 つのオプションがあります。

  1. ストアド プロシージャに固執しますが、その場合は動的 SQL を使用する必要があります。ストアド プロシージャは、使用できる SQL ステートメントの文字列を作成しUSE master、データベース名などを動的に設定できるようにし、 を使用してその SQL ステートメントを実行しますsp_executesql @sqlRestoreStatement。これを確認したい場合は、 Erland Sommarskogの影響力のある記事The Curse and Blessings of Dynamic SQL をぜひ読んで (そして理解して) ください。

  2. おそらくSQLCMDプレースホルダーを使用して(SQL Server Management Studioで有効にしている場合)、通常のSQLスクリプトを使用しSQLCMD mode、通常のスクリプトから復元を実行できます(たとえば、独自のテンプレートフォルダーに配置できます)。その場合、次のようなものがあります。

    :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

USE ステートメントは必要ありません。Use ステートメントを削除し、master データベース自体でこの sp を作成/変更することをお勧めします。

バックアップを取得する場合は、マスター DB からこの SP を実行します。他に道が見えません。

于 2012-08-06T09:43:31.790 に答える
0

リンク サーバーを作成し、それをストアド プロシージャで参照することができます。例えば。LinkedServer.database.[dbo].StoredProcedure

2000年と2005年のデータベースがあるSQL Server 2008用のリンクサーバーを作成する方法を確認してください

于 2013-10-18T15:54:16.873 に答える