SQL Server"RESTORE FILELISTONLY"结果集

mev*_*ven 14 t-sql sql-server database-restore

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

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

EXEC('RESTORE FILELISTONLY FROM DISK = ''C:\backup.bak''')
Run Code Online (Sandbox Code Playgroud)

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

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

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

SELECT * FROM  
EXEC('RESTORE FILELISTONLY FROM DISK = ''C:\backup.bak''')
Run Code Online (Sandbox Code Playgroud)

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

提前致谢...

Tim*_*dge 42

死胡同:SELECT INTO很好,因为你不必定义表列,但它不支持EXEC.

解决方案:INSERT INTO支持EXEC,但需要定义表.使用MSDN提供SQL 2008定义,我编写了以下脚本:

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
Run Code Online (Sandbox Code Playgroud)

  • 在SQL Server 2012需要添加一个新列后,`SnapshotURL nvarchar(360)`,例如按照https://msdn.microsoft.com/en-us/library/ms173778.aspx,但我不确定是否适用于SQL Server 2014或2016(我_think_它始于2016年......) (11认同)
  • 对于SQL Server 2005,使用相同的表定义,但有一个区别:删除最后一列(TDEThumbprint varbinary(32)). (2认同)

Rem*_*anu 9

你不能从EXEC中选择.您只能INSERT到表(或表变量)EXEC的结果集.

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


小智 6

这是适用于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
Run Code Online (Sandbox Code Playgroud)