5

Comment insérer ResultSet donnée par les commandesComment insérer dans une table temporaire l'information donnée par RESTORE FILELISTONLY/HEADERONLY/VERIFYONLY

RESTORE FILELISTONLY 
RESTORE HEADERONLY 
RESTORE VERIFYONLY 

dans une table temporaire générée automatiquement?

Je voudrais utiliser une technique similaire à (si la table est automatiquement créé, avec toutes les colonnes correspondant aux colonnes du resultset)

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

Mais cela ne fonctionne pas. Si je pouvais remplir un TempTable, je pourrais alors utiliser les informations contenues dans une instruction SQL suivante (dans mon cas une instruction DB de restauration dans laquelle je dois utiliser certaines chaînes contenues dans le jeu de résultats donné par RESTORE FILELISTONLY)

J'utilise sql server 2008.

Répondre

7

Personnellement, il s'agit d'un scénario dans lequel j'éviterais TSQL pur et j'utiliserais un script ou un programme externe. En fonction de ce que vous essayez de faire, vous pourriez constater que l'utilisation de Smo de Powershell ou .NET évite complètement le besoin de TSQL de toute façon. Je dis cela parce que travailler avec des sauvegardes semble toujours conduire à travailler avec des fichiers en dehors de la base de données, et TSQL est juste trop gênant.

Ceci étant dit, si vous êtes sûr que vous devez faire en TSQL, alors vous pouvez faire quelque chose comme ceci:

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

Ou, pour être un peu plus agréable:

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 

Vous devrez toujours créer la table en premier, cependant, ce qui n'est pas une grosse affaire et a du sens quand même si vous le faites beaucoup. La documentation en ligne répertorie le type de données pour chaque colonne dans le jeu de résultats, mais au moins pour moi (SQL2008 SP1) la documentation ne correspond pas au jeu de résultats réel, donc vous devrez peut-être le modifier.

+0

+1, bonne réponse –

+1

Ok merci. Comme la table n'est pas créée automatiquement, je vais suivre votre suggestion et le faire avec un programme de toute façon, pas en TSQL. – LaBracca

4

Je sais que l'OP utilisait , mais nous avons tous déménagé sur quelques années et je viens d'écrire un proc stocké pour qui prend la DatabaseBackupLSN, donc pensé que je partagerais ...

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 

Les documents RESTORE HEADERONLY sont here.

Exemple d'utilisation:

DECLARE @databaseBackupLsn NUMERIC(25, 0) 

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

SELECT @databaseBackupLsn 

Update 18/02/2016: SQL Server 2014 Service Pack 1 ajouté 3 nouvelles colonnes à la sortie RESTORE HEADERONLY: KeyAlgorithmEncryptorThumbprintEncryptorType. J'ai ajouté ces colonnes à la procédure ci-dessus.

Questions connexes