RESTORE HEADERONLY에서 필드 추출


12

복원 하려는 백업이 만들어진 날짜를 얻기 위해 ' RESTORE HEADERONLY ' 를 사용하려고합니다 .

명령 :

RESTORE HEADERONLY FROM DISK = '<path to .bak file>'

Query Analyzer에서 제대로 작동하고 50 개의 열과 같은 결과 집합을 제공합니다.

실제로 코드 에서이 문제에 액세스하고 있습니다.

50 : ish 열 중 하나를 모두 선언하고 삽입 exec하고 원하는 값을 가져 와서 임시 테이블로 가져올 수 있습니다 .

문제는 전체 버전을 임시 버전으로 선언하지 않아도된다는 것입니다. 향후 버전에서 열을 추가하면 매우 부서지기 쉬운 솔루션처럼 보입니다.

모든 열을 선언하지 않고이 결과 집합에서 단일 열을 가져 오는 방법이 있습니까?

답변:


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''''
'')'
) 

임시 분산 쿼리의 옵션이 활성화 될 필요가있다. 또는 원하지 않는 경우 루프백 연결된 서버를 설정하고 대신 사용할 수 있습니다.

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''''
'')')

영리하고 공유 해주셔서 감사합니다. 그러나 단지 기록 덕분에 나는 이것이 결국 큰 열 목록처럼 취성 / 복잡하다고 생각합니다. 아쉬운 해결책이 없습니다.
Tim Abell

@TimAbell-네, 실제로 테이블 정의를 얻는 것을 제외하고 실제로 이것을 실제로 사용하지는 않을 것이라고 생각합니다.
Martin Smith

1
어느 쿼리도 작동시키지 못했습니다. "RESTORE HEADERONLY ... 문이 메타 데이터 검색을 지원하지 않으므로 메타 데이터를 확인할 수 없습니다"라는 오류 메시지가 표시됩니까? 나는 sp_describe_first_result_set시스템 sp가 범인 이라고 믿는다 . 나는 또한이 질문을 여기서
Stackoverflowuser

@Stackoverflowuser-원래부터 2008 인스턴스에 대해 이것을 테스트 한 것처럼 보이 MARTINPC\MSSQL2008므로 이후 버전에서 변경되어 더 이상 작동하지 않을 수 있습니다.
Martin Smith

1
@Stackoverflowuser, 위 예제는 서버 @@ version <2012 일 때 작동합니다. 2012 년부터이 쿼리를 실행하는 대신이 프로파일 러에서 다음을 볼 수 있습니다. exec [sys] .sp_describe_first_result_set N'SET FMTONLY OFF; EXEC ( ''디스크에서 하드 디스크로 복원 = '' ''C : \ Program Files \ Microsoft SQL Server \ MSSQL10.MSSQL2008 \ MSSQL \ Backup \ DB1.bak '' '' '') ', NULL, 1
sepupic

7

이것은 파일에서 백업 날짜를 얻기 위해 작성한 버전 독립적 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

1
당으로 stackoverflow.com/a/31318785/489865support.microsoft.com/en-us/kb/3058865 , 당신은 "SQL 서버 2014"를 추가 한 keyalgorithm의 / EncryptorThumbprint / EncryptorType 실제로에만 SP1에서 나타났다. 나는 그것을위한 빌드 버전이라고 생각 12.0.4100.1하므로 코드 SERVERPROPERTY('ProductVersion')는 그것을 올바르게 수용하기 위해 모든 필드를 조사해야 합니다.
JonBrave

7

어떤 종류의 코드를 세부적으로 지정하지 않고 'code'에서 데이터에 액세스하는 것에 대해서만 물었으므로 PowerShell 솔루션을 제시합니다 .

Invoke-SQLcmd -Query "RESTORE HEADERONLY FROM DISK = 'R:\SQLFiles\MSSQL.MSSQLSERVER.Backup\Backup.bak'" | Select-Object MachineName,DatabaseName,HasBackupChecksums,BackupStartDate,BackupFinishDate

1
`ls | % {$ _. fullname} | % {invoke-sqlcmd -Query "DISK HEADRONLY FROM DISK = '$ _'"}} | 형식 테이블`
루이스 펠리페

6

구식 방식으로 참조하십시오.

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;

1
SQL2014에서 작업이를 얻으려면, 당신은 테이블의 끝에 다음과 같은 추가 필드가해야합니다 : 봉쇄 TINYINT, keyalgorithm의의 NVARCHAR (32), EncryptorThumbprint의 VARBINARY (20), EncryptorType NVARCHAR (32)
마이크

모든 것에 varchar를 사용하지 않으며 SQL Server 2014에 대한 추가 열을 포함하는 이 답변 도 있습니다 .
Baodad

이러한 추가 열은 실제로 SQL 2014 SP1에 추가되었습니다 . 그 빌드 버전은 12.0.4100.1입니다.
JonBrave
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.