我正在尝试获取一个每日.bak文件,该文件具有静态名称,但文件名中的日期和时间戳格式为'Filename_yyyyMMdd_hhmm.bak'。
如果我手动输入与文件匹配的时间,我创建的脚本会起作用,但是当我尝试使其自动化时,它将无法工作,因为生成文件的时间会改变(通常仅需几分钟即可解决。< / p>
有人可以提供帮助以解决此问题吗?
DECLARE @BackupFile varchar(1000)
SELECT @BackupFile = SELECT '\NETWORKLOCATION\FILENAME_' + FORMAT(CAST(GETDATE() AS date),'yyyyMMdd') + '_HHmm.bak')
RESTORE DATABASE [Test]
FROM DISK = @BackupFile
WITH REPLACE
我正在使用SQL Server。
答案 0 :(得分:0)
T-SQL在处理文件时非常受限制。对于复杂的任务,最好使用Ola Hallengren的Backup script和Brent Ozar的sp_DatabaseRestore这样的脚本。
Ola Hallengren的脚本可以通过验证,清除等方式备份一个或多个数据库。语句:
EXECUTE dbo.DatabaseBackup
@Databases = 'USER_DATABASES',
@Directory = 'C:\Backup',
@BackupType = 'FULL',
@Verify = 'Y',
@Compress = 'Y',
@CheckSum = 'Y',
@CleanupTime = 24
将找到所有用户数据库,并在c:\Backup
中创建完整备份,其名称格式为:
SERVER_DATABASE_FULL_YYYYMMDD_hhmmss.bak
它还将验证备份并清除较旧的备份
Brent Ozar的脚本可自动恢复使用Ola Hallengren的命名约定创建的备份。
此调用将恢复数据库LogShipMe
的最新完整备份:
EXEC dbo.sp_DatabaseRestore
@Database = 'LogShipMe',
@BackupPathFull = 'D:\Backup\SQL2016PROD1A\LogShipMe\FULL\',
@BackupPathLog = 'D:\Backup\SQL2016PROD1A\LogShipMe\LOG\',
@ContinueLogs = 0,
@RunRecovery = 1;
如果您查看sp_DatabaseRestore
的源代码,您会发现您真的不想自己编写此代码。使用以下文件检索文件:
SET @cmd = N'DIR /b "' + @BackupPathFull + N'"';
INSERT INTO @FileList (BackupFile)
EXEC master.sys.xp_cmdshell @cmd;
将所有文件放入表变量中,以便可以对其进行过滤,排序等。