web-dev-qa-db-ja.com

SQLServerの「RESTOREFILELISTONLY」結果セット

自動バックアップを作成してT-SQLスクリプトを復元しようとしています。 BACKUPの部分を実行しましたが、RESTOREで苦労しています。

SS ManagementStudioで次のステートメントを実行すると;

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''')

結果セットのメタデータは、SQLServerディクショナリのどこかに保存する必要があります。自動復元を機能させるための他のバンドエイド式を見つけましたが、結果セットに到達できれば、よりエレガントなソリューションを作成できます。また、結果セットは2008年と2005年で異なることに注意してください。

前もって感謝します...

14
mevdiven

行き止まりSELECT INTOは、テーブルの列を定義する必要がないので便利ですが、EXECをサポートしていません。

ソリューションINSERT INTOEXECをサポートしますが、テーブルを定義する必要があります。 MSDNが提供するSQL 2008定義 を使用して次のスクリプトを作成しました。

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
40
Tim Partridge

EXECからSELECTすることはできません。 EXECの結果セットをテーブル(またはテーブル変数)に挿入することしかできません。

復元の自動化に関しては、 完全に自動化されたSQL Server復元 の答えは、ソリューションを構築するために必要なすべてのものをすでに提供しています。ファイルリストが不明なデータベースの自動復元を試みる必要があるかどうかは、別のトピックです。

9
Remus Rusanu

これは、SQL2005とSQL2017の間のすべてのバージョンで機能するコードです。

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
5
A. Leroy