2010-03-24 2 views
9

Я пытаюсь написать автоматическое резервное копирование и восстановление T-SQL-скриптов. Я сделал часть BACKUP, но я борюсь с RESTORE.SQL Server «RESTORE FILELISTONLY» Resultset

Когда я запускаю следующую инструкцию в 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. Я нашел другую формулу групповой помощи, чтобы получить автоматическое восстановление, но если я смогу добраться до набора результатов, я бы создал более элегантное решение. Также обратите внимание, что ResultSet отличается в 2008 году, чем 2005

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

ответ

7

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

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

+0

Спасибо за ответ. Но я озадачил, что комментарий EXEC находит поля из команды RESTORE где-то (словарь, метаданные и т. Д.). Почему select не может получить доступ к одному и тому же ресурсу для извлечения полей набора результатов. – mevdiven

+1

EXEC получает поля из результирующего набора. Нет ни словаря, ни метаданных. –

31

тупиковых: 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 
+2

Для SQL Server 2005 используйте одно и то же определение таблицы с одним отличием: отпустите последний столбец (TDEThumbprint varbinary (32)). –

+5

После того, как SQL Server 2012 потребуется добавить новый столбец, «SnapshotURL nvarchar (360)», например. как https://msdn.microsoft.com/en-us/library/ms173778.aspx, но я не уверен, что это для SQL Server 2014 или 2016 (я _think_ он начинается в 2016 году ...) – JonBrave

Смежные вопросы