5

Come inserire il gruppo di risultati dato dai comandiCome inserire in una tabella temporanea informazioni data dal RESTORE FILELISTONLY/HEADERONLY/VERIFYONLY

RESTORE FILELISTONLY 
RESTORE HEADERONLY 
RESTORE VERIFYONLY 

in una tabella temporanea generata automaticamente?

Vorrei usare una tecnica simile a (in modo che il tavolo è automatica creato, con tutte le colonne corrispondenti colonne del ResultSet)

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

Ma questo non funziona. Se potessi popolare un TempTable potrei essere in grado di utilizzare le informazioni in esso contenute in una seguente istruzione SQL (nel mio caso un'istruzione DB di ripristino in cui ho bisogno di utilizzare alcune stringhe contenute nel set di risultati dato da RESTORE FILELISTONLY)

sto usando sql server 2008.

risposta

7

Personalmente, questo è uno scenario in cui vorrei evitare TSQL pura e utilizzare uno script o un programma esterno. A seconda di ciò che stai cercando di fare, potresti scoprire che l'uso di Smo da Powershell o .NET evita completamente la necessità di TSQL. Dico questo perché lavorare con i backup sembra sempre portare a lavorare con file al di fuori del database, e quindi TSQL è troppo complicato.

Detto questo, se si è sicuri che si deve fare questo in TSQL, allora si può fare qualcosa di simile:

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

O, per essere un po 'più bello:

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 

Prima dovresti comunque creare il tavolo, il che non è un grosso problema e ha senso comunque se lo fai molto. La documentazione in linea elenca il tipo di dati per ogni colonna nel set di risultati, ma almeno per me (SQL2008 SP1) la documentazione non corrisponde al set di risultati effettivo, quindi potrebbe essere necessario modificarlo.

+0

+1, buona risposta –

+1

Ok, grazie. Poiché la tabella non viene creata automaticamente seguirò il tuo suggerimento e lo farò con un programma comunque, non in TSQL. – LaBracca

4

So che il PO stava usando , ma abbiamo tutti spostato su un paio di anni e ho appena scritto una stored procedure per che individua la DatabaseBackupLSN, così ho pensato di condividere ...

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 

I documenti RESTORE HEADERONLY sono here.

Esempio Utilizzo:

DECLARE @databaseBackupLsn NUMERIC(25, 0) 

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

SELECT @databaseBackupLsn 

Aggiornamento 18/02/2016: SQL Server 2014 Service Pack 1 aggiunto 3 nuove colonne a RESTORE HEADERONLY uscita: KeyAlgorithmEncryptorThumbprintEncryptorType. Ho aggiunto queste colonne alla procedura sopra.

Problemi correlati