代码之家  ›  专栏  ›  技术社区  ›  mevdiven

SQL Server“Restore FileListOnly”结果集

  •  12
  • mevdiven  · 技术社区  · 16 年前

    我正在尝试编写一个自动备份和恢复T-SQL脚本。我已经完成了备份部分,但我正在努力恢复。

    当我在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年不同。

    事先谢谢…

    3 回复  |  直到 7 年前
        1
  •  9
  •   Community Mohan Dere    9 年前

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

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

        2
  •  39
  •   CJ Dennis    9 年前

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

    解决方案 : INSERT INTO 支架 执行程序 ,但需要定义表。使用 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
    
        3
  •  1
  •   A. Leroy    7 年前

    这是一个代码,适用于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