2010-03-24 208 views
9

我試圖編寫一個自動備份並還原T-SQL腳本。我做了BACKUP部分,但我在RESTORE上苦苦掙扎。SQL Server「RESTORE FILELISTONLY」結果集

當我在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字典的某處。我發現其他創可貼公式可以讓我的自動恢復工作,但如果可以找到結果集,我會創建更優雅的解決方案。同時請注意,結果集,2008年不同於2005年

在此先感謝...

回答

7

不能從EXEC選擇。您只能將EXEC的結果集插入到表(或表變量)中。

至於自動恢復,Fully automated SQL Server Restore的答案已經爲您提供了構建解決方案所需的一切。是否需要嘗試自動恢復未知文件列表的數據庫,這是一個不同的話題。

+0

感謝您的回覆。但我困惑的是,EXEC評論從某處(字典,元數據等)找到了來自RESTORE命令的字段。爲什麼選擇不能訪問相同的資源來提取結果集字段。 – mevdiven 2010-03-25 12:58:59

+1

EXEC從結果集中獲取字段。沒有涉及字典和元數據。 – 2010-03-25 23:18:03

31

死端:因爲你沒有定義表格列,但它不支持EXECSELECT INTO是好的。

解決方案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))。 – 2012-09-25 18:46:34

+5

在SQL Server 2012需要添加一個新列之後,'SnapshotURL nvarchar(360)',例如按照https://msdn.microsoft.com/en-us/library/ms173778.aspx,但我不確定這是否適用於SQL Server 2014或2016(我_think_它始於2016年...) – JonBrave 2016-08-25 14:23:45