SQL Server "RESTORE FILELISTONLY" Resultset - PullRequest
14 голосов
/ 25 марта 2010

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

Когда я запускаю следующую инструкцию в SS Management Studio;

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

Я получаю набор результатов в сетке, а также могу использовать

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

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

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

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

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

Ответы [ 3 ]

39 голосов
/ 26 октября 2010

Тупик : 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
9 голосов
/ 25 марта 2010

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

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

5 голосов
/ 24 декабря 2018

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