如何在临时表中插入RESTORE FILELISTONLY / HEADERONLY / VERIFYONLY给出的信息

时间:2010-08-05 09:21:16

标签: sql-server sql-server-2008 temp-tables database-restore

如何插入命令给出的结果集

RESTORE FILELISTONLY
RESTORE  HEADERONLY
RESTORE VERIFYONLY

进入自动生成的临时表?

我想使用类似的技术(因此表是自动创建的,所有列都匹配结果集的列)

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

但这不起作用。如果我可以填充TempTable,那么我可以在下面的SQL语句中使用它中包含的信息(在我的情况下是一个恢复DB语句,我需要使用RESTORE FILELISTONLY给出的结果集中包含的一些字符串)

我正在使用sql server 2008。

2 个答案:

答案 0 :(得分:7)

就个人而言,这是我避免使用纯TSQL并使用外部脚本或程序的一种情况。根据您尝试做的事情,您可能会发现使用Powershell或.NET中的Smo完全避免了对TSQL的需求。我这样说是因为使用备份似乎总是导致使用数据库之外的文件,然后TSQL就太尴尬了。

说了这么多,如果您确定必须在TSQL中执行此操作,那么您可以执行以下操作:

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

或者更好一点:

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

然而,你仍然需要先创建表格,这不是什么大问题,如果你这么做的话,无论如何都是有意义的。联机丛书列出了结果集中每列的数据类型,但至少对我来说(SQL2008 SP1),文档与实际结果集不匹配,因此您可能需要对其进行调整。

答案 1 :(得分:5)

我知道OP正在使用 2008 ,但我们已经搬了几年而且我刚刚为 2014 编写了一个存储过程,它选择了{{ 1}},以为我会分享......

DatabaseBackupLSN

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 个文档为here

使用示例:

RESTORE HEADERONLY

2016年2月18日更新SQL Server 2014 Service Pack 1DECLARE @databaseBackupLsn NUMERIC(25, 0) EXEC GetDatabaseBackupLsn 'd:\transfer\YourDatabaseBackup_2015_07_09_05_31_59.bak', @databaseBackupLsn OUT SELECT @databaseBackupLsn 输出中添加了3个新列:RESTORE HEADERONLY KeyAlgorithm EncryptorThumbprint 。我已将这些列添加到上述过程中。