SQL SERVER批量还原数据库语句

当需要还原多个数据库时,一个一个还原会比较麻烦,通过语句的方式批量还原数据库解放双手,完美执行。

执行前需要赋值的变量:

@BackupFilePath:备份所在文件夹

@DataPath:新库所在文件夹

@DataBackup:通过临时表的方式指定需要还原的备份库

完整SQL语句:

--备份所在文件夹
DECLARE @BackupFilePath NVARCHAR(MAX) = N'E:\MSSQL\Backup\'
--新库所在文件夹
DECLARE @DataPath NVARCHAR(MAX) = N'E:\MSSQL\DATA\'

DECLARE @DataBackup TABLE (NewDataName NVARCHAR(100), BackUpName NVARCHAR(100));

--自定语句:新的库名,备份文件名
INSERT INTO @DataBackup 
SELECT N'NewTest1', N'test'
UNION SELECT N'NewTest2', N'test'


DECLARE @DatabaseName NVARCHAR(MAX)--数据库名
DECLARE @BackupName NVARCHAR(MAX)--备份名
DECLARE @DataLogicalName NVARCHAR(MAX)--数据逻辑名
DECLARE @LogLogicalName NVARCHAR(MAX)--日志逻辑名

--备份信息临时表
DECLARE @FileList TABLE (
    LogicalName NVARCHAR(128),
    PhysicalName NVARCHAR(260),
    [Type] CHAR(1),
    FileGroupName NVARCHAR(128),
    Size BIGINT,
    MaxSize BIGINT,
    FileID BIGINT,
    CreateLSN NUMERIC,
    DropLSN NUMERIC,
    UniqueID UNIQUEIDENTIFIER,
    ReadOnlyLSN NUMERIC,
    ReadWriteLSN NUMERIC,
    BackupSizeInBytes BIGINT,
    SourceBlockSize INT,
    FileGroupID INT,
    LogGroupGUID UNIQUEIDENTIFIER,
    DifferentialBaseLSN NUMERIC,
    DifferentialBaseGUID UNIQUEIDENTIFIER,
    IsReadOnly BIT,
    IsPresent BIT,
    TDEThumbprint VARBINARY(32),
    SnapshotUrl NVARCHAR(32)
);

--定义游标
DECLARE db_cursor CURSOR FOR
select * from @DataBackup

--打开游标
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @DatabaseName, @BackupName

WHILE @@FETCH_STATUS = 0
BEGIN

	--清空备份信息表
	DELETE FROM @FileList;
	--插入备份信息表
	INSERT INTO @FileList
	EXEC('RESTORE FILELISTONLY FROM DISK = '''+@BackupFilePath + @BackupName+'.bak''');
	--读取逻辑名
	SELECT @DataLogicalName = LogicalName FROM @FileList where Type = 'D';
	SELECT @LogLogicalName = LogicalName FROM @FileList where Type = 'L';
	
	--数据库是否存在
	DECLARE @DataBaseIsExist int = 0 

	IF EXISTS (SELECT 1 FROM sys.databases WHERE name = @DatabaseName)
	BEGIN
		set @DataBaseIsExist = 1
	END

	--SQL变量
    DECLARE @Sql NVARCHAR(MAX)
    DECLARE @Sql1 NVARCHAR(MAX)
    DECLARE @Sql2 NVARCHAR(MAX)
	
	--数据库连接
	SET @Sql1 = 'ALTER DATABASE '+@DatabaseName+' SET OFFLINE WITH ROLLBACK IMMEDIATE'
    
	IF @DataBaseIsExist = 1
	BEGIN
		EXEC sp_executesql @Sql1
	END
	--还原数据库
	SET @Sql = 'RESTORE DATABASE ' + QUOTENAME(@DatabaseName) + 
               ' FROM DISK = ''' + @BackupFilePath + @BackupName + '.bak'' ' +
               ' WITH REPLACE, RECOVERY, ' +
               ' MOVE ''' + @DataLogicalName + ''' TO N''' + @DataPath + @DatabaseName+'.mdf'', ' +
               ' MOVE ''' + @LogLogicalName + ''' TO N''' + @DataPath + @DatabaseName+'_log.ldf'';'
    
	print @Sql
    EXEC sp_executesql @Sql
	--恢复数据库连接
	SET @Sql2 = 'ALTER DATABASE '+@DatabaseName+' SET ONLINE;'
    
	IF @DataBaseIsExist = 1
	BEGIN
		EXEC sp_executesql @Sql2
	END
    --指针
    FETCH NEXT FROM db_cursor INTO @DatabaseName, @BackupName
END
--关闭游标
CLOSE db_cursor
DEALLOCATE db_cursor

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值