2010-03-24 9 views
9

Próbuję napisać automatyczne kopie zapasowe i przywracać skrypty T-SQL. Zrobiłem część BACKUP, ale walczę z RESTORE.Serwer SQL "RESTORE FILELISTONLY" Zestaw wyników

Po uruchomieniu następującego oświadczenia o SS Management Studio;

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

dostaję zestaw wyników w siatce, a także można użyć

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

aby wypełnić tabelę temp. Jednak pojawia się błąd składniowy, gdy próbuję wybrać z tego zestawu wyników. np.

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

Metadane zestawu wyników powinny być przechowywane gdzieś w Słowniku serwera SQL. Znalazłem inną formułę pomocy dla zespołu, która sprawiła, że ​​moje automatyczne przywracanie działało, ale jeśli uda się uzyskać zestaw wyników, utworzyłbym bardziej eleganckie rozwiązanie. Również należy pamiętać, że wynikowa jest inna niż w 2008 roku 2005.

z góry dzięki ...

Odpowiedz

7

nie można wybrać z EXEC. Można tylko wstawić do tabeli (lub zmiennej tabeli) zestaw wyników EXEC.

Jeśli chodzi o automatyzację przywracania, odpowiedź pod numerem Fully automated SQL Server Restore zawiera już wszystko, czego potrzeba do zbudowania rozwiązania. Czy to automatyczne odtwarzanie baz danych z nieznaną listą plików jest czymś, co należy podjąć, to jest inny temat.

+0

Dzięki za odpowiedź. Ale zdziwiłem się, że komentarz EXEC znajduje gdzieś z polecenia RESTORE skądś (słownik, metadane itp.). Dlaczego nie można uzyskać dostępu do tego samego zasobu, aby wyodrębnić pola zestawu wyników. – mevdiven

+1

EXEC pobiera pola z zestawu wyników. Nie ma słownika ani metadanych. –

31

Gniazdo końcowe: SELECT INTO jest dobre, bo nie masz do definiowania kolumn tabeli, ale nie obsługuje EXEC.

Rozwiązanie: INSERT INTO obsługuje EXEC, ale wymaga tabelę zostać zdefiniowane. Używając SQL 2008 definition provided by MSDN napisałem następujący skrypt:

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

Dla programu SQL Server 2005 użyj tej samej definicji tabeli z jedną różnicą: upuść ostatnią kolumnę (TDEThumbprint varbinary (32)). –

+5

Po SQL Server 2012 będzie trzeba dodać nową kolumnę, 'SnapshotURL nvarchar (360)', np. jak na https://msdn.microsoft.com/en-us/library/ms173778.aspx, ale nie jestem pewien, czy jest to dla SQL Server 2014 lub 2016 (I _think_ to zaczyna się w 2016 ...) – JonBrave

Powiązane problemy