Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何将RESTORE FILELISTONLY/HEADERONLY/VERIFYONLY提供的信息插入临时表中_Sql Server_Sql Server 2008_Temp Tables_Database Restore - Fatal编程技术网

Sql server 如何将RESTORE FILELISTONLY/HEADERONLY/VERIFYONLY提供的信息插入临时表中

Sql server 如何将RESTORE FILELISTONLY/HEADERONLY/VERIFYONLY提供的信息插入临时表中,sql-server,sql-server-2008,temp-tables,database-restore,Sql Server,Sql Server 2008,Temp Tables,Database Restore,如何插入命令给出的结果集 RESTORE FILELISTONLY RESTORE HEADERONLY RESTORE VERIFYONLY 自动生成的临时表 我想使用类似的技术(因此表是自动创建的,所有列都与resultset的列匹配) 但这不起作用。如果我可以填充一个诱惑,那么我就可以在下面的SQL语句中使用其中包含的信息(在我的例子中是restore DB语句,在该语句中,我需要使用restore FILELISTONLY提供的resultset中包含的一些字符串) 我正在使用sql

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

RESTORE FILELISTONLY
RESTORE  HEADERONLY
RESTORE VERIFYONLY
自动生成的临时表

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

但这不起作用。如果我可以填充一个诱惑,那么我就可以在下面的SQL语句中使用其中包含的信息(在我的例子中是restore DB语句,在该语句中,我需要使用restore FILELISTONLY提供的resultset中包含的一些字符串)


我正在使用sql server 2008。

就我个人而言,这是一种避免使用纯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),文档与实际结果集不匹配,因此您可能需要对其进行调整。

我知道OP使用的是2008,但我们都向前走了几年,我刚刚为2014编写了一个存储过程,它选择了
数据库backuplsn
,所以我想我会与大家分享

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 headerly
docs被删除

用法示例:

DECLARE @databaseBackupLsn NUMERIC(25, 0) 

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

SELECT @databaseBackupLsn

更新日期2016年2月18日:在
还原标题
输出中添加了3个新列:
KeyAlgorithm
EncryptorHumbprint
EncryptorType
。我已将这些列添加到上述过程。

好的,谢谢。由于表不是自动创建的,所以我将按照您的建议使用一个程序,而不是TSQL。
DECLARE @databaseBackupLsn NUMERIC(25, 0) 

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

SELECT @databaseBackupLsn