2010-03-24 81 views
9

我试图编写一个自动备份并还原T-SQL脚本。我做了BACKUP部分,但我在RESTORE上苦苦挣扎。SQL Server“RESTORE FILELISTONLY”结果集

当我在SS Management Studio上运行以下语句时;

EXEC('RESTORE FILELISTONLY FROM DISK = ''C:\backup.bak''') 

我得到了一个定格的结果,也是我可以使用

INSERT INTO <temp_table> 
EXEC('RESTORE FILELISTONLY FROM DISK = ''C:\backup.bak''') 

填充一个临时表。但是,当我尝试从该结果集中选择时,出现语法错误。例如

SELECT * FROM 
EXEC('RESTORE FILELISTONLY FROM DISK = ''C:\backup.bak''') 

结果集元数据应该存储在SQL Server字典的某处。我发现其他创可贴公式可以让我的自动恢复工作,但如果可以找到结果集,我会创建更优雅的解决方案。同时请注意,结果集,2008年不同于2005年

在此先感谢...

回答

7

不能从EXEC选择。您只能将EXEC的结果集插入到表(或表变量)中。

至于自动恢复,Fully automated SQL Server Restore的答案已经为您提供了构建解决方案所需的一切。是否需要尝试自动恢复未知文件列表的数据库,这是一个不同的话题。

+0

感谢您的回复。但我困惑的是,EXEC评论从某处(字典,元数据等)找到了来自RESTORE命令的字段。为什么选择不能访问相同的资源来提取结果集字段。 – mevdiven 2010-03-25 12:58:59

+1

EXEC从结果集中获取字段。没有涉及字典和元数据。 – 2010-03-25 23:18:03

31

死端:因为你没有定义表格列,但它不支持EXECSELECT INTO是好的。

解决方案INSERT INTO支持EXEC,但要求定义表。使用SQL 2008 definition provided by MSDN我写了以下脚本:

DECLARE @fileListTable TABLE (
    [LogicalName]   NVARCHAR(128), 
    [PhysicalName]   NVARCHAR(260), 
    [Type]     CHAR(1), 
    [FileGroupName]   NVARCHAR(128), 
    [Size]     NUMERIC(20,0), 
    [MaxSize]    NUMERIC(20,0), 
    [FileID]    BIGINT, 
    [CreateLSN]    NUMERIC(25,0), 
    [DropLSN]    NUMERIC(25,0), 
    [UniqueID]    UNIQUEIDENTIFIER, 
    [ReadOnlyLSN]   NUMERIC(25,0), 
    [ReadWriteLSN]   NUMERIC(25,0), 
    [BackupSizeInBytes]  BIGINT, 
    [SourceBlockSize]  INT, 
    [FileGroupID]   INT, 
    [LogGroupGUID]   UNIQUEIDENTIFIER, 
    [DifferentialBaseLSN] NUMERIC(25,0), 
    [DifferentialBaseGUID] UNIQUEIDENTIFIER, 
    [IsReadOnly]   BIT, 
    [IsPresent]    BIT, 
    [TDEThumbprint]   VARBINARY(32) -- remove this column if using SQL 2005 
) 
INSERT INTO @fileListTable EXEC('RESTORE FILELISTONLY FROM DISK = ''YourBackupFile.bak''') 
SELECT * FROM @fileListTable 
+2

对于SQL Server 2005,请使用具有一个区别的相同表定义:删除最后一列(TDEThumbprint varbinary(32))。 – 2012-09-25 18:46:34

+5

在SQL Server 2012需要添加一个新列之后,'SnapshotURL nvarchar(360)',例如按照https://msdn.microsoft.com/en-us/library/ms173778.aspx,但我不确定这是否适用于SQL Server 2014或2016(我_think_它始于2016年...) – JonBrave 2016-08-25 14:23:45