LaB*_*cca 6 sql-server temp-tables database-restore sql-server-2008
如何插入命令给出的结果集
RESTORE FILELISTONLY
RESTORE HEADERONLY
RESTORE VERIFYONLY
Run Code Online (Sandbox Code Playgroud)
进入自动生成的临时表?
我想使用类似的技术(因此表是自动创建的,所有列都匹配结果集的列)
SELECT * INTO #TempTable
FROM (RESTORE FILELISTONLY FROM DISK = 'c:\Test\Test.bak')
Run Code Online (Sandbox Code Playgroud)
但这不起作用.如果我可以填充TempTable,那么我就可以在下面的SQL语句中使用它中包含的信息(在我的例子中是一个恢复DB语句,我需要使用RESTORE FILELISTONLY给出的结果集中包含的一些字符串)
我正在使用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''')
Run Code Online (Sandbox Code Playgroud)
或者更好一点:
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
Run Code Online (Sandbox Code Playgroud)
不过,你仍然需要先创建表格,这对于你做了很多事情都没有什么大不了的意义.联机丛书列出了结果集中每列的数据类型,但至少对我来说(SQL2008 SP1),文档与实际结果集不匹配,因此您可能需要对其进行调整.
我知道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
Run Code Online (Sandbox Code Playgroud)
该RESTORE HEADERONLY文档是在这里.
用法示例:
DECLARE @databaseBackupLsn NUMERIC(25, 0)
EXEC GetDatabaseBackupLsn
'd:\transfer\YourDatabaseBackup_2015_07_09_05_31_59.bak',
@databaseBackupLsn OUT
SELECT @databaseBackupLsn
Run Code Online (Sandbox Code Playgroud)
2016年2月18日更新:SQL Server 2014 Service Pack 1在RESTORE HEADERONLY输出中添加了3个新列:KeyAlgorithm EncryptorThumbprint EncryptorType.我已将这些列添加到上面的过程中.