SQL Server“RESTORE FILELISTONLY”结果集

时间:2010-03-24 21:22:01

标签: sql-server tsql database-restore

我正在尝试编写自动备份并恢复T-SQL脚本。我已经做了BACKUP部分,但我在RESTORE上苦苦挣扎。

当我在SS Management Studio上运行以下声明时;

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

我在网格中得到了一个结果集,我也可以使用

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

填充临时表。但是,当我尝试从该结果集中进行选择时,我会收到语法错误。 e.g

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

结果集元数据应存储在SQL Server Dictionary中的某处。我找到了其他的创可贴配方来让我的自动恢复工作,但是如果可以进入结果集,我会创建更优雅的解决方案。另请注意,结果集在2008年与2005年不同。

提前致谢...

3 个答案:

答案 0 :(得分:39)

死胡同SELECT INTO很不错,因为您不必定义表列,但它不支持EXEC

解决方案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

答案 1 :(得分:9)

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

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

答案 2 :(得分:2)

这是适用于SQL 2005和SQL 2017之间所有版本的代码:

CREATE TABLE #FileListHeaders (     
     LogicalName    nvarchar(128)
    ,PhysicalName   nvarchar(260)
    ,[Type] char(1)
    ,FileGroupName  nvarchar(128) NULL
    ,Size   numeric(20,0)
    ,MaxSize    numeric(20,0)
    ,FileID bigint
    ,CreateLSN  numeric(25,0)
    ,DropLSN    numeric(25,0) NULL
    ,UniqueID   uniqueidentifier
    ,ReadOnlyLSN    numeric(25,0) NULL
    ,ReadWriteLSN   numeric(25,0) NULL
    ,BackupSizeInBytes  bigint
    ,SourceBlockSize    int
    ,FileGroupID    int
    ,LogGroupGUID   uniqueidentifier NULL
    ,DifferentialBaseLSN    numeric(25,0) NULL
    ,DifferentialBaseGUID   uniqueidentifier NULL
    ,IsReadOnly bit
    ,IsPresent  bit
)
IF cast(cast(SERVERPROPERTY('ProductVersion') as char(4)) as float) > 9 -- Greater than SQL 2005 
BEGIN
    ALTER TABLE #FileListHeaders ADD TDEThumbprint  varbinary(32) NULL
END
IF cast(cast(SERVERPROPERTY('ProductVersion') as char(2)) as float) > 12 -- Greater than 2014
BEGIN
    ALTER TABLE #FileListHeaders ADD SnapshotURL    nvarchar(360) NULL
END
INSERT INTO #FileListHeaders
EXEC ('RESTORE FILELISTONLY FROM DISK = N''BackupFileName.bak''')

SELECT * FROM #FileListHeaders

DROP TABLE #FileListHeaders