【问题标题】:Select .bak file with latest timestamp [closed]选择具有最新时间戳的 .bak 文件 [关闭]
【发布时间】:2012-07-02 01:51:46
【问题描述】:

我想将数据库备份文件 .bak 恢复到服务器,但有几个时间戳不同的 .bak 文件,例如:

dbname_backup_201210290200.bak
dbname_backup_201210300212.bak
dbname_backup_201210310213.bak

【问题讨论】:

  • Please don't use varchar without specifying a length。另外,为什么需要在 T-SQL 中执行此操作? PowerShell 或 C# 更擅长回答诸如“从给定文件夹中具有特定扩展名的最新文件中获取文件名的一部分”之类的问题。
  • 这个问题没用,但在谷歌搜索中仍然出现...... smh

标签: sql-server database backup restore


【解决方案1】:

假设 xp_cmdshell 已启用并且所有文件将以 yyyyMMddhhmm.bak 结尾:

CREATE TABLE #x(n VARCHAR(2048));

DECLARE @cmd VARCHAR(2048), @fn VARCHAR(2048), @folder VARCHAR(255);

SET @folder = 'E:\sqlbackup\MerchantAPIReport\'; --'
SET @cmd = 'dir /b "' + @folder + 'MerchantAPIReport_backup_*.bak"';

INSERT #x EXEC master..xp_cmdshell @cmd;

SELECT TOP (1) @fn = @folder + n 
  FROM #x
  ORDER BY CONVERT(DATETIME, 
    STUFF(STUFF(LEFT(RIGHT(n, 16), 12), 11, 0, ':'), 9, 0, ' '))
  DESC;

-- whatever you do, don't try to construct this yourself.
-- I'll fill in the blanks for you. <sigh>

RESTORE DATABASE [MerchantAPIReport] FROM DISK = @fn
  WITH FILE = 1,
  MOVE N'MerchantAPIReport'     TO N'D:\SQLData01\MerchantAPIReport.mdf',
  MOVE N'MerchantAPIReport_log' TO N'F:\SQLLog\MerchantAPIReport.ldf',
  NOUNLOAD, REPLACE, STATS = 10;

-- RESTORE DATABASE ... FROM @fn ...; -- fill in the rest here

DROP TABLE #x;

【讨论】:

  • @user1484403 您是否检查过我是否正确复制了您的文件夹名称?你检查过#x 中包含的内容吗?
  • @user1484403 抱歉,但我不明白您真正想要保留问题的哪一部分。如果您只想要具有最新时间戳的 .bak 文件,那么我提供的代码应该就是您所需要的。如果您还有其他未说明的要求,请说明或提出新问题。
  • 对不起,我有 juz 编辑到另一个版本
猜你喜欢
  • 2014-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-23
  • 2019-04-30
  • 2012-08-08
相关资源
最近更新 更多