SQL Server RESTORE FILELISTONLY Набор результатов

Я пытаюсь написать автоматическое резервное копирование и восстановление сценариев 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''')

для заполнения временной таблицы. Однако я получаю синтаксическую ошибку, когда пытаюсь выбрать из этого набора результатов. например

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

Метаданные набора результатов должны храниться где-то в словаре SQL Server. Я нашел другую формулу пластыря, чтобы заставить мое автоматическое восстановление работать, но если бы я мог получить набор результатов, я бы создал более элегантное решение. Также обратите внимание, что набор результатов в 2008 и 2005 годах отличается.

Заранее спасибо...


person mevdiven    schedule 24.03.2010    source источник


Ответы (3)


Тупик: SELECT INTO хорош тем, что вам не нужно определять столбцы таблицы, но он не поддерживает EXEC.

Решение: INSERT INTO поддерживает EXEC, но требует определения таблицы. Используя определение SQL 2008, предоставленное 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
person Tim Partridge    schedule 25.10.2010
comment
Для SQL Server 2005 используйте то же определение таблицы с одним отличием: удалите последний столбец (TDEThumbprint varbinary(32)). - person Paul Chernoch; 25.09.2012
comment
После SQL Server 2012 потребуется добавить новый столбец SnapshotURL nvarchar(360), например. согласно msdn.microsoft.com/en-us/library/ms173778.aspx, но я не уверен, для SQL Server 2014 или 2016 (я думаю, он начинается в 2016 году...) - person JonBrave; 25.08.2016

Вы не можете SELECT из EXEC. Вы можете только ВСТАВИТЬ в таблицу (или табличную переменную) результирующий набор EXEC.

Что касается автоматического восстановления, ответ на полностью автоматизированное восстановление SQL Server уже дает вам все необходимое для создания решения. Стоит ли пытаться автоматически восстанавливать базы данных с неизвестным списком файлов, это отдельная тема.

person Remus Rusanu    schedule 24.03.2010
comment
Спасибо за ответ. Но я озадачен тем, что комментарий EXEC находит поля из команды RESTORE откуда-то (словарь, метаданные и т. д.). Почему select не может получить доступ к тому же ресурсу для извлечения полей набора результатов. - person mevdiven; 25.03.2010
comment
EXEC получает поля из набора результатов. Нет ни словаря, ни метаданных. - person Remus Rusanu; 26.03.2010

Это код, работающий со всеми версиями между 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
person A. Leroy    schedule 24.12.2018