如何编写恢复含数据库名+当日日期备份文件的SQL脚本?
恢复带日期命名的SQL Server备份文件
嘿,我看你需要恢复那种「数据库名称_日.月.年.bak」格式的备份文件(比如test_01.05.2018.bak),你给的原脚本在日期拼接上有点问题,没法生成符合要求的格式,我帮你调整一下:
首先是适配SQL Server 2012及以上版本的脚本,用FORMAT函数能更简洁地生成日期格式:
DECLARE @BackupFile AS nvarchar(128); -- 生成匹配「数据库名称_日.月.年.bak」的备份文件路径 -- 这里默认恢复前一天的备份,若要恢复当日备份,把DATEADD(day, -1, GETDATE())改成GETDATE()即可 SET @BackupFile = N'C:\backup\test_' + FORMAT(DATEADD(day, -1, GETDATE()), 'dd.MM.yyyy') + N'.bak'; USE master; RESTORE DATABASE [TEST] FROM DISK = @BackupFile WITH FILE = 1, -- 指定备份集中的第一个备份文件 MOVE N'test1' TO N'C:\db\TEST.mdf', -- 移动数据文件到目标路径 MOVE N'test1_log' TO N'C:\db\TEST_log.ldf', -- 移动日志文件到目标路径 NOUNLOAD, -- 不卸载备份介质 REPLACE, -- 覆盖已存在的同名数据库(执行前请确认!) STATS = 10; -- 每完成10%进度输出状态信息
如果你的SQL Server版本低于2012(不支持FORMAT函数),可以用CONVERT和字符串拼接来实现相同效果:
DECLARE @BackupFile AS nvarchar(128); SET @BackupFile = N'C:\backup\test_' -- 补零确保日、月是两位数字 + RIGHT('0' + CAST(DAY(DATEADD(day, -1, GETDATE())) AS VARCHAR(2)), 2) + '.' + RIGHT('0' + CAST(MONTH(DATEADD(day, -1, GETDATE())) AS VARCHAR(2)), 2) + '.' + CAST(YEAR(DATEADD(day, -1, GETDATE())) AS VARCHAR(4)) + N'.bak'; USE master; RESTORE DATABASE [TEST] FROM DISK = @BackupFile WITH FILE = 1, MOVE N'test1' TO N'C:\db\TEST.mdf', MOVE N'test1_log' TO N'C:\db\TEST_log.ldf', NOUNLOAD, REPLACE, STATS = 10;
几点注意事项:
- 如果你不需要恢复前一天的备份,直接把所有
DATEADD(day, -1, GETDATE())替换成GETDATE()就行。 REPLACE参数会直接覆盖已存在的同名数据库,执行前一定要确认目标数据库可以被覆盖!- 确保SQL Server服务账号有备份目录和目标数据目录的读写权限,否则会报错。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

