Gostaria de escrever um script de automação que restaura um banco de dados SQL Server de seu arquivo de backup. No entanto, fazer isso não é um procedimento simples em SQL porque a consulta principal precisa de entradas adicionais que podem ser obtidas usando outra consulta. Posso fazer isso em uma consulta?
Já existe uma pergunta no SO; mas a solução não é muito flexível . RESTORE FILELISTONLY
A definição de 's muda com muita frequência. Mesmo de outra forma, a solução parece muito detalhada.
Não existe uma maneira mais simples de armazenar os resultados de uma consulta em uma variável e usá-los? Esta é uma moleza em qualquer linguagem de programação.
Obtenha o nome lógico:
RESTORE FILELISTONLY FROM DISK = 'D:SourceBackUpFile.bak' GO
Restaure o banco de dados:
RESTORE DATABASE DBName FROM DISK = 'D:SourceBackUpFile.bak' WITH RECOVERY MOVE 'SourceMDFLogicalName' TO 'D:TargetMDFFile.mdf', MOVE 'SourceLDFLogicalName' TO 'D:TargetLDFFile.ldf'
Retirado desta pergunta SO . Isso parece funcionar para todas as versões até 2019, inclusive.
Apenas para notar, a definição mudou duas vezes desde o SQL 2000 - eu não julgo 2 mudanças em 19 anos como uma mudança frequente pessoalmente. Nesse sentido, eu não me preocuparia em usar RESTORE FILELISTONLY desde que você use um script genérico como o abaixo.
Eu escrevi uma postagem no blog SQLServerScience.com que mostra como obter os detalhes que você procura e é compatível com todas as versões do SQL Server desde 2008+
Este é o código principal desse post do blog:
O comando gerado
RESTORE DATABASE
se parece com:Esse código também foi testado na versão Linux do SQL Server 2017.
Você perguntou:
O requisito aqui não é adicionar um valor a uma variável. Precisamos extrair o conteúdo de um conjunto de dados díspares em uma tabela. Pode ser conceitualmente semelhante a carregar uma matriz de um objeto. No entanto, no SQL Server, a única maneira de armazenar os resultados da saída do comando, como o
RESTORE HEADERONLY
comando, é primeiro inseri-lo em uma tabela e, em seguida, obter os valores específicos da tabela desejada.Por que não usar dbatools ou sp_restoregene que estão disponíveis gratuitamente?
Ambos podem fazer o que você procura.