2010-03-24 12 views
9

Sto provando a scrivere un backup automatico e ripristinare gli script T-SQL. Ho fatto parte BACKUP ma sto lottando su RESTORE.SQL Server "RESTORE FILELISTONLY" Resultset

Quando si esegue la seguente istruzione su SS Management Studio;

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

ottengo un set di risultati in una griglia e anche io può usare

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

per popolare una tabella temporanea. Tuttavia ottengo l'errore di sintassi, quando provo a selezionare da quel gruppo di risultati. ad esempio

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

I metadati dei risultati devono essere memorizzati da qualche parte nel dizionario di SQL Server. Ho trovato altre formule di aiuto per la banda per far funzionare il ripristino automatico, ma se riesco ad arrivare al set di risultati, creerei una soluzione più elegante. Inoltre si prega di notare che di risultati è diverso nel 2008 rispetto al 2005.

Grazie in anticipo ...

risposta

7

Non è possibile selezionare da EXEC. È possibile INSERIRE in una tabella (o variabile di tabella) solo il set di risultati di un EXEC.

Per quanto riguarda l'automazione del ripristino, la risposta allo Fully automated SQL Server Restore fornisce già tutto ciò che è necessario per creare una soluzione. Se il ripristino automatico di database con elenco di file sconosciuto è qualcosa da provare, questo è un argomento diverso.

+0

Grazie per la risposta. Ma mi sono meravigliato del fatto che il commento di EXEC trovi campi del comando RESTORE da qualche parte (dizionario, metadati, ecc.). Perché select non può accedere alla stessa risorsa per estrarre i campi del set di risultati. – mevdiven

+1

EXEC ottiene i campi dal set di risultati. Non sono coinvolti né dizionario né metadati. –

31

Dead-end: SELECT INTO è bello perché non c'è bisogno di definire le colonne della tabella, ma non supporta EXEC.

Soluzione: INSERT INTO supporta EXEC, ma richiede la definizione della tabella. Utilizzando lo SQL 2008 definition provided by MSDN ho scritto il seguente script:

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

Per SQL Server 2005, utilizzare la stessa definizione di tabella con una differenza: rilasciare l'ultima colonna (TDEThumbprint varbinary (32)). –

+5

Dopo che SQL Server 2012 avrà bisogno di aggiungere una nuova colonna, 'SnapshotURL nvarchar (360)', ad es. come per https://msdn.microsoft.com/en-us/library/ms173778.aspx, ma non sono sicuro che sia per SQL Server 2014 o 2016 (I _thth__ inizia nel 2016 ...) – JonBrave