alu*_*lun 12 sql-server sql-server-2008-r2 restore
我正在尝试使用“ RESTORE HEADERONLY ”来获取我将要恢复的备份的日期。
命令:
RESTORE HEADERONLY FROM DISK = '<path to .bak file>'
Run Code Online (Sandbox Code Playgroud)
在查询分析器中工作正常,并提供一个包含 50 列之类的结果集。
问题实际上是从代码访问它。
我可以通过声明 50:ish 列中的每一个将其放入临时表中,插入其中exec
并从那里获取我想要的值。
问题是我真的想避免将整个结果集声明为临时表,因为如果他们在未来的版本中向其中添加列,这似乎是一个非常脆弱的解决方案。
有没有办法只从这个结果集中获取一列而不声明所有列?
Mar*_*ith 12
这对我有用。
SELECT BackupStartDate
FROM OPENROWSET('SQLNCLI',
'Server=MARTINPC\MSSQL2008;Trusted_Connection=yes;',
'SET NOCOUNT ON;SET FMTONLY OFF;EXEC(''
RESTORE HEADERONLY
FROM DISK = ''''C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQL2008\MSSQL\Backup\DB1.bak''''
'')'
)
Run Code Online (Sandbox Code Playgroud)
该专案分布式查询选项需要启用。或者,如果您不想这样做,您可以设置一个环回链接服务器并使用它。
EXEC sp_addlinkedserver @server = 'LOCALSERVER', @srvproduct = '',
@provider = 'SQLOLEDB', @datasrc = @@servername
SELECT BackupStartDate
FROM OPENQUERY(LOCALSERVER,
'SET FMTONLY OFF;
EXEC(''
RESTORE HEADERONLY
FROM DISK = ''''C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQL2008\MSSQL\Backup\DB1.bak''''
'')')
Run Code Online (Sandbox Code Playgroud)
小智 9
由于您只询问了从“代码”访问数据的问题,而没有详细说明什么类型的代码,因此我在此介绍PowerShell解决方案:
Invoke-SQLcmd -Query "RESTORE HEADERONLY FROM DISK = 'R:\SQLFiles\MSSQL.MSSQLSERVER.Backup\Backup.bak'" | Select-Object MachineName,DatabaseName,HasBackupChecksums,BackupStartDate,BackupFinishDate
Run Code Online (Sandbox Code Playgroud)
小智 8
这是我编写的一个独立于版本的 sp,用于从文件中获取备份日期。
它针对 SQL 2008R2、2012 和 2014 进行了测试。
IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = 'spGetBackupDateFromFile')
EXEC ('CREATE PROC dbo.spGetBackupDateFromFile AS SELECT ''stub version, to be replaced''')
GO
/*----------------------------------------------------------------------
spGetBackupDateFromFile
------------------------------------------------------------------------
Versie : 1.0
Autheur : Theo Ekelmans
Datum : 2016-03-31
Change : Initial release
------------------------------------------------------------------------*/
alter procedure dbo.spGetBackupDateFromFile(@BackupFile as varchar(1000), @DT as datetime output) as
declare @BackupDT datetime
declare @sql varchar(8000)
declare @ProductVersion NVARCHAR(128)
declare @ProductVersionNumber TINYINT
SET @ProductVersion = CONVERT(NVARCHAR(128),SERVERPROPERTY('ProductVersion'))
SET @ProductVersionNumber = SUBSTRING(@ProductVersion, 1, (CHARINDEX('.', @ProductVersion) - 1))
if object_id('dbo.tblBackupHeader') is not null drop table dbo.tblBackupHeader
set @sql = ''
-- THIS IS GENERIC FOR SQL SERVER 2008R2, 2012 and 2014
if @ProductVersionNumber in(10, 11, 12)
set @sql = @sql +'
create table dbo.tblBackupHeader
(
BackupName varchar(256),
BackupDescription varchar(256),
BackupType varchar(256),
ExpirationDate varchar(256),
Compressed varchar(256),
Position varchar(256),
DeviceType varchar(256),
UserName varchar(256),
ServerName varchar(256),
DatabaseName varchar(256),
DatabaseVersion varchar(256),
DatabaseCreationDate varchar(256),
BackupSize varchar(256),
FirstLSN varchar(256),
LastLSN varchar(256),
CheckpointLSN varchar(256),
DatabaseBackupLSN varchar(256),
BackupStartDate varchar(256),
BackupFinishDate varchar(256),
SortOrder varchar(256),
CodePage varchar(256),
UnicodeLocaleId varchar(256),
UnicodeComparisonStyle varchar(256),
CompatibilityLevel varchar(256),
SoftwareVendorId varchar(256),
SoftwareVersionMajor varchar(256),
SoftwareVersionMinor varchar(256),
SoftwareVersionBuild varchar(256),
MachineName varchar(256),
Flags varchar(256),
BindingID varchar(256),
RecoveryForkID varchar(256),
Collation varchar(256),
FamilyGUID varchar(256),
HasBulkLoggedData varchar(256),
IsSnapshot varchar(256),
IsReadOnly varchar(256),
IsSingleUser varchar(256),
HasBackupChecksums varchar(256),
IsDamaged varchar(256),
BeginsLogChain varchar(256),
HasIncompleteMetaData varchar(256),
IsForceOffline varchar(256),
IsCopyOnly varchar(256),
FirstRecoveryForkID varchar(256),
ForkPointLSN varchar(256),
RecoveryModel varchar(256),
DifferentialBaseLSN varchar(256),
DifferentialBaseGUID varchar(256),
BackupTypeDescription varchar(256),
BackupSetGUID varchar(256),
CompressedBackupSize varchar(256),'
-- THIS IS SPECIFIC TO SQL SERVER 2012
if @ProductVersionNumber in(11)
set @sql = @sql +'
Containment varchar(256),'
-- THIS IS SPECIFIC TO SQL SERVER 2014
if @ProductVersionNumber in(12)
set @sql = @sql +'
Containment tinyint,
KeyAlgorithm nvarchar(32),
EncryptorThumbprint varbinary(20),
EncryptorType nvarchar(32),'
--All versions (This field added to retain order by)
set @sql = @sql +'
Seq int NOT NULL identity(1,1)
);
'
exec (@sql)
set @sql = 'restore headeronly from disk = '''+ @BackupFile +''''
insert into dbo.tblBackupHeader
exec(@sql)
select @DT = BackupStartDate from dbo.tblBackupHeader
if object_id('dbo.tblBackupHeader') is not null drop table dbo.tblBackupHeader
Run Code Online (Sandbox Code Playgroud)
小智 7
老方法,供参考:
declare @backupFile varchar(max) = 'C:\backupfile.bak';
declare @dbName varchar(256);
-- THIS IS SPECIFIC TO SQL SERVER 2012
--
declare @headers table
(
BackupName varchar(256),
BackupDescription varchar(256),
BackupType varchar(256),
ExpirationDate varchar(256),
Compressed varchar(256),
Position varchar(256),
DeviceType varchar(256),
UserName varchar(256),
ServerName varchar(256),
DatabaseName varchar(256),
DatabaseVersion varchar(256),
DatabaseCreationDate varchar(256),
BackupSize varchar(256),
FirstLSN varchar(256),
LastLSN varchar(256),
CheckpointLSN varchar(256),
DatabaseBackupLSN varchar(256),
BackupStartDate varchar(256),
BackupFinishDate varchar(256),
SortOrder varchar(256),
CodePage varchar(256),
UnicodeLocaleId varchar(256),
UnicodeComparisonStyle varchar(256),
CompatibilityLevel varchar(256),
SoftwareVendorId varchar(256),
SoftwareVersionMajor varchar(256),
SoftwareVersionMinor varchar(256),
SoftwareVersionBuild varchar(256),
MachineName varchar(256),
Flags varchar(256),
BindingID varchar(256),
RecoveryForkID varchar(256),
Collation varchar(256),
FamilyGUID varchar(256),
HasBulkLoggedData varchar(256),
IsSnapshot varchar(256),
IsReadOnly varchar(256),
IsSingleUser varchar(256),
HasBackupChecksums varchar(256),
IsDamaged varchar(256),
BeginsLogChain varchar(256),
HasIncompleteMetaData varchar(256),
IsForceOffline varchar(256),
IsCopyOnly varchar(256),
FirstRecoveryForkID varchar(256),
ForkPointLSN varchar(256),
RecoveryModel varchar(256),
DifferentialBaseLSN varchar(256),
DifferentialBaseGUID varchar(256),
BackupTypeDescription varchar(256),
BackupSetGUID varchar(256),
CompressedBackupSize varchar(256),
Containment varchar(256),
--
-- This field added to retain order by
--
Seq int NOT NULL identity(1,1)
);
insert into @headers exec('restore headeronly from disk = '''+ @backupFile +'''');
select @dbName = DatabaseName from @headers;
select @dbName;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
17395 次 |
最近记录: |