![](/img/trans.png)
[英]SQL-Server: Error - Logical file is not part of database. Use RESTORE FILELISTONLY to list the logical file names
[英]SQL Server “RESTORE FILELISTONLY” Resultset
我正在嘗試編寫自動備份並恢復T-SQL腳本。 我已經做了BACKUP部分,但我在RESTORE上苦苦掙扎。
當我在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 Dictionary中的某處。 我找到了其他的創可貼配方來讓我的自動恢復工作,但是如果可以進入結果集,我會創建更優雅的解決方案。 另請注意,結果集在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中選擇。 您只能INSERT到表(或表變量)EXEC的結果集。
至於自動恢復, 全自動SQL Server Restore的答案已經為您提供了構建解決方案所需的一切。 是否要嘗試自動恢復具有未知文件列表的數據庫,這是一個不同的主題。
這是一個使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.