2012-07-02 90 views
-2

.bak文件,我想一个数据库备份文件名.bak恢复到服务器,但也有不同的时间戳几.bak文件,例如:选择具有最新时间戳

dbname_backup_201210290200.bak
dbname_backup_201210300212.bak
dbname_backup_201210310213.bak

+0

[请不要使用'varchar'而不指定长度](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-declaring-varchar -without-length.aspx)。另外,为什么你需要从T-SQL内部做到这一点? PowerShell或C#在回答诸如“让我使用特定文件夹中的特定扩展名的最新文件中的文件名”中配置好得多。 –

+0

这个问题没用,但仍然出现在谷歌搜索... smh –

回答

4

假设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; 
+0

@ user1484403你检查我是否正确复制了你的文件夹名?你检查了#x中包含的内容吗? –

+0

@ user1484403对不起,但我不明白你实际想保留哪部分问题。如果你只是想要带有最新时间戳的.bak文件,我所提供的代码应该是你所需要的。如果还有其他要求没有说明,请说出来或者提出一个新问题。 –

+0

对不起,我有juz编辑到另一个版本 – user1484403

相关问题