SQL 带有数据库名称参数的服务器还原过程

SQL Server restore proc with database name parameter

正在寻找从 .bak 文件恢复的存储过程,但希望能够输入数据库名称作为参数,即 Exec sp_restore @dbname

使用 Sql Server Management Studio,您可以开始执行还原操作。在完成任务之前,您应该能够看到一个 "Script" 按钮。这将创建一个脚本,其中包含您手动输入的所有参数,包括 mdf 和 ldf 位置。然后您可以保存此脚本并随意执行它。您还可以修改生成的脚本,使数据库名称成为输入变量。你真的可以做任何事。是 SQL!

恢复数据库并更改 mdf 和 ldf 文件位置的示例脚本如下所示:

RESTORE DATABASE [example] FROM  DISK = N'E:\Backup\example.BAK' WITH  FILE = 1,  MOVE N'ExampleData' TO N'E:\dbfiles\example.mdf',  MOVE N'example_log' TO N'E:\dbfiles\example.ldf',  NOUNLOAD,  STATS = 10
GO

您可以阅读有关 RESTORE statement

的更多信息

然后您可以将脚本插入到存储过程中:

CREATE PROCEDURE RestoreDb
    -- Add the parameters for the stored procedure here
    @dbName nvarchar(50)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    RESTORE DATABASE @dbName FROM  DISK = N'C:\Data\MSSQL\Backup\lolwut.bak' WITH  FILE = 1,  NOUNLOAD,  STATS = 10

END
GO

从 bak 文件@DeviceName 恢复数据库的过程。它适用于具有两个逻辑文件的数据库。 使用方法:

EXEC RestoreDb @dbName='qqq', @DeviceName = 'D:\temp\R.bak'

对不起我的英语,我会改进它。

CREATE PROCEDURE RestoreDb
    @dbName NVARCHAR(50),
    @DeviceName NVARCHAR(400)
AS
    SET NOCOUNT ON

    DECLARE @Cmd NVARCHAR(1000),
        @DataLogicalName NVARCHAR(200),
        @LogLogicalName NVARCHAR(200),
        @DatabasePath   NVARCHAR(200),
        @DataPath NVARCHAR(300),
        @LogPath  NVARCHAR(300)

    CREATE TABLE #Files
        (
        LogicalName         nvarchar(128),
        PhysicalName        nvarchar(260),
        [Type]              char(1),
        FileGroupName       nvarchar(128),
        Size                numeric(20,0),
        MaxSize             numeric(20,0),
        FileID              bigint,
        CreateLSN           numeric(25,0),
        DropLSN             numeric(25,0),
        UniqueID            uniqueidentifier,
        ReadOnlyLSN         numeric(25,0) ,
        ReadWriteLSN        numeric(25,0),
        BackupSizeInBytes   bigint,
        SourceBlockSize     int,
        FileGroupID         int,
        LogGroupGUID        uniqueidentifier,
        DifferentialBaseLSN numeric(25,0),
        DifferentialBaseGUID    uniqueidentifier,
        IsReadOnly          bit,
        IsPresent           bit,
        TDEThumbprint       varbinary(32)
        )

    SELECT @DatabasePath = 'D:\data\'

    SELECT @DataPath = @DatabasePath + @dbName + '.mdf',
        @LogPath = @DatabasePath + @dbName + '.ldf'

    SELECT @Cmd = 'RESTORE FILELISTONLY
    FROM DISK = ''' + @DeviceName + ''''

    INSERT #Files
    EXEC (@Cmd)

    IF NOT EXISTS(SELECT 1 FROM #Files) GOTO ERRORFILES

    IF (SELECT COUNT(*) FROM #Files) > 2 GOTO ERRORFILESCOUNT

    SELECT @DataLogicalName = LogicalName
    FROM #Files
    WHERE [Type] = 'D'

    SELECT @LogLogicalName = LogicalName
    FROM #Files
    WHERE [Type] = 'L'

    RESTORE DATABASE @DbName
    FROM DISK = @DeviceName
    WITH 
    MOVE @DataLogicalName TO @DataPath,
    MOVE @LogLogicalName  TO @LogPath

GOTO EXITSTAT

ERRORFILES:
    BEGIN
        RAISERROR( 'The list of files contained in the backup set is empty', 16, 1 )
        GOTO EXITSTAT
    END

ERRORFILESCOUNT:
    BEGIN
        RAISERROR( 'The count of files contained in the backup set is more than two', 16, 1 )
        GOTO EXITSTAT
    END

EXITSTAT: