SQL Server "восстановить FILELISTONLY" Resultset

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

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

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

2 ответов


вы не можете выбрать из EXEC. В таблицу (или переменную таблицы) можно вставить только результирующий набор EXEC.

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


тупик: 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