自動バックアップを作成して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年で異なることに注意してください。
前もって感謝します...
行き止まり:SELECT INTO
は、テーブルの列を定義する必要がないので便利ですが、EXEC
をサポートしていません。
ソリューション:INSERT INTO
はEXEC
をサポートしますが、テーブルを定義する必要があります。 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
EXECからSELECTすることはできません。 EXECの結果セットをテーブル(またはテーブル変数)に挿入することしかできません。
復元の自動化に関しては、 完全に自動化されたSQL Server復元 の答えは、ソリューションを構築するために必要なすべてのものをすでに提供しています。ファイルリストが不明なデータベースの自動復元を試みる必要があるかどうかは、別のトピックです。
これは、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