7

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

RESTORE FILELISTONLY
RESTORE  HEADERONLY
RESTORE VERIFYONLY

进入自动生成的临时表?

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

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

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

我正在使用 sql server 2008。

4

2 回答 2

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)来说,文档与实际结果集不匹配,因此您可能需要对其进行调整。

于 2010-08-05T11:36:07.190 回答
6

我知道 OP 使用的是2008,但是我们都已经前进了几年,我刚刚为2014编写了一个存储过程,它选择了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

RESTORE HEADERONLY文档这里。

示例用法:

DECLARE @databaseBackupLsn NUMERIC(25, 0) 

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

SELECT @databaseBackupLsn

2016 年 2 月 18 日更新SQL Server 2014 Service Pack 1在输出中添加了 3 个新列RESTORE HEADERONLYKeyAlgorithm EncryptorThumbprint EncryptorType. 我已将这些列添加到上述过程中。

于 2015-07-09T13:21:44.183 回答