2010-08-05 12 views
5

¿Cómo insertar el conjunto de resultados dado por los comandosCómo insertar en una tabla temporal de la información dada por RESTORE FILELISTONLY/HEADERONLY/VERIFYONLY

RESTORE FILELISTONLY 
RESTORE HEADERONLY 
RESTORE VERIFYONLY 

en una tabla temporal generada de forma automática?

me gustaría usar una técnica similar a (lo que la tabla se ha creado automáticamente, con todas las columnas correspondientes columnas del conjunto de resultados)

SELECT * INTO #TempTable 
FROM (RESTORE FILELISTONLY FROM DISK = 'c:\Test\Test.bak') 

Pero esto no funciona. Si pudiera poblar una TempTable, podría utilizar la información contenida en ella en una siguiente instrucción SQL (en mi caso, una instrucción DB de restauración en la que necesito usar algunas cadenas contenidas en el conjunto de resultados de RESTORE FILELISTONLY)

Estoy usando el servidor sql 2008.

Respuesta

7

Personalmente, este es un escenario en el que evitaría el puro TSQL y usaría un script o programa externo. Dependiendo de lo que intente hacer, puede encontrar que el uso de Smo de Powershell o .NET evita por completo la necesidad de TSQL de todos modos. Lo digo porque trabajar con copias de seguridad siempre parece llevar a trabajar con archivos fuera de la base de datos, y entonces TSQL es demasiado incómodo.

Habiendo dicho todo esto, si está seguro de que usted debe hacer esto en TSQL, a continuación, puede hacer algo como esto:

insert into dbo.BackupFiles (LogicalName, PhysicalName, ...) 
exec('RESTORE FILELISTONLY FROM DISK = ''c:\Test\Test.bak''') 

O para ser un poco más agradable:

declare @Command nvarchar(4000) 
-- you can build the command string some other way, of course 
set @Command = N'RESTORE FILELISTONLY FROM DISK = ''c:\Test\Test.bak''' 

insert into dbo.BackupFiles (LogicalName, PhysicalName, ...) 
exec sp_executesql @Command 

Todavía tendría que crear primero la tabla, sin embargo, que no es gran cosa y tiene sentido de todos modos si hace esto mucho. Books Online enumera el tipo de datos para cada columna en el conjunto de resultados, pero al menos para mí (SQL2008 SP1) la documentación no coincide con el conjunto de resultados real, por lo que es posible que deba ajustarlo.

+0

+1, buena respuesta –

+1

Ok gracias. Como la tabla no se crea automáticamente, seguiré su sugerencia y lo haré con un programa de todos modos, no en TSQL. – LaBracca

4

Sé el PO estaba usando , pero todo lo que he pasado unos años y que acabo de escribir un procedimiento almacenado para que recoge el DatabaseBackupLSN, así que pensé que iba a compartir ...

CREATE PROCEDURE [Utilities].[GetDatabaseBackupLsn] 
(
    @filePath VARCHAR(1000), 
    @databaseBackupLsn NUMERIC(25, 0) OUT 
) 
AS 
BEGIN 

DECLARE @backupInfo TABLE 
(
    BackupName nvarchar(128), 
    BackupDescription nvarchar(255), 
    BackupType smallint, 
    ExpirationDate datetime, 
    Compressed bit, 
    Position smallint, 
    DeviceType tinyint, 
    UserName nvarchar(128), 
    ServerName nvarchar(128), 
    DatabaseName nvarchar(128), 
    DatabaseVersion int, 
    DatabaseCreationDate datetime, 
    BackupSize numeric(20, 0), 
    FirstLSN numeric(25, 0), 
    LastLSN numeric(25, 0), 
    CheckpointLSN numeric(25, 0), 
    DatabaseBackupLSN numeric(25, 0), 
    BackupStartDate datetime, 
    BackupFinishDate datetime, 
    SortOrder smallint, 
    [CodePage] smallint, 
    UnicodeLocaleId int, 
    UnicodeComparisonStyle int, 
    CompatibilityLevel tinyint, 
    SoftwareVendorId int, 
    SoftwareVersionMajor int, 
    SoftwareVersionMinor int, 
    SoftwareVersionBuild int, 
    MachineName nvarchar(128), 
    Flags int, 
    BindingId uniqueidentifier, 
    RecoveryForkId uniqueidentifier, 
    Collation nvarchar(128), 
    FamilyGUID uniqueidentifier, 
    HasBulkLoggedData bit, 
    IsSnapshot bit, 
    IsReadOnly bit, 
    IsSingleUser bit, 
    HasBackupChecksums bit, 
    IsDamaged bit, 
    BeginsLogChain bit, 
    HasIncompleteMetaData bit, 
    IsForceOffline bit, 
    IsCopyOnly bit, 
    FirstRecoveryForkID uniqueidentifier, 
    ForkPointLSN numeric(25, 0), 
    RecoveryModel nvarchar(60), 
    DifferentialBaseLSN numeric(25, 0), 
    DifferentialBaseGUID uniqueidentifier, 
    BackupTypeDescription nvarchar(60), 
    BackupSetGUID uniqueidentifier, 
    CompressedBackupSize bigint, 
    Containment tinyint, 
    KeyAlgorithm nvarchar(32), 
    EncryptorThumbprint varbinary(20), 
    EncryptorType nvarchar(32) 
) 

DECLARE @sql NVARCHAR(1100) 
SET @sql = N'RESTORE HEADERONLY FROM DISK = ''' + @filePath + '''' 

INSERT @backupInfo 
EXEC(@sql) 

SELECT @databaseBackupLSN = DatabaseBackupLSN 
FROM @backupInfo 

END 

Los documentos RESTORE HEADERONLY son here.

Ejemplo de uso:

DECLARE @databaseBackupLsn NUMERIC(25, 0) 

EXEC GetDatabaseBackupLsn 
    'd:\transfer\YourDatabaseBackup_2015_07_09_05_31_59.bak', 
    @databaseBackupLsn OUT 

SELECT @databaseBackupLsn 

actualización 18/02/2016: SQL Server 2014 Service Pack 1 añadió 3 nuevas columnas a la salida RESTORE HEADERONLY: KeyAlgorithmEncryptorThumbprintEncryptorType. He agregado estas columnas al procedimiento anterior.

Cuestiones relacionadas