Servidor SQL "restaurar a sequência FILELISTONLY"

Estou a tentar escrever um backup automático e restaurar os scripts T-SQL. Fiz a parte de BACKUP, mas estou a lutar pela restauração.

Quando eu executar a seguinte declaração no estúdio de gestão SS;

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

tenho um resultado definido numa grelha e também posso usar

INSERT INTO <temp_table> 
EXEC('RESTORE FILELISTONLY FROM DISK = ''C:\backup.bak''')
Para preencher uma mesa temporária. No entanto, eu recebo erro de sintaxe, quando eu tento selecionar a partir desse conjunto de resultados. e. g

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

Os meta-dados do conjunto de resultados devem ser guardados algures no dicionário do servidor de SQL. Encontrei outro. fórmula de band-aid para que a minha restauração automática funcione, mas se puder chegar ao resultado, eu criaria uma solução mais elegante. Note também que o resultado é diferente em 2008 do que em 2005.

Obrigado antecipadamente...

Author: mevdiven, 2010-03-25

2 answers

Não podes seleccionar o EXEC. Você só pode inserir em uma tabela (ou variável da tabela) o conjunto de resultados de um EXEC.

Quanto à automatização da restauração, a resposta em restauração totalmente automatizada do servidor SQL já lhe dá tudo o que precisa para criar uma solução. Se a restauração automatizada de bancos de dados com lista de arquivos desconhecidos é algo a ser tentado, que é um tópico diferente.

 8
Author: Remus Rusanu, 2017-05-23 11:45:26

Beco sem saída: SELECT INTO é bom porque você não tem que definir as colunas da tabela, mas não suporta EXEC.

Solução: INSERT INTO suporta EXEC, mas requer que a tabela seja definida. Usando a definição de SQL 2008 fornecida pelo MSDN , escrevi o seguinte programa:

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
 38
Author: Tim Partridge, 2017-01-12 08:12:45