পুনরুদ্ধার হেডরোনালি থেকে একটি ক্ষেত্র আহরণ করা


12

আমি পুনরুদ্ধার করতে চলেছি সেই ব্যাকআপটি তৈরি হওয়ার তারিখটি পেতে ' হ্যান্ডারলি রিস্টোর ' ব্যবহার করার চেষ্টা করছি।

আদেশ:

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

ক্যোয়ারী অ্যানালাইজারে সূক্ষ্ম কাজ করে এবং 50 টি কলামের মতো ফলাফল দেয়।

সমস্যাটি আসলে কোড থেকে এটি অ্যাক্সেস করে।

আমি 50: ইশ কলামগুলির প্রত্যেকটির এককটি ঘোষণার মাধ্যমে এটি একটি টেম্প টেবিলের মধ্যে পেতে পারি, এটিতে serোকানো 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''''
'')')

চালাক, এবং ভাগ করে নেওয়ার জন্য ধন্যবাদ, তবে কেবল রেকর্ডের জন্য আমি মনে করি এটি শেষের কলামগুলির বড়-ওলি-তালিকার মতো ভঙ্গুর / জটিল। লজ্জা একটি মার্জিত সমাধান নেই।
টিম আবেল

@ টিমবেল - হ্যাঁ আমি মনে করি না যে আমি প্রথমে টেবিলের সংজ্ঞা পেতে কেবল বাস্তবে এটি ব্যবহারে ব্যবহার করব।
মার্টিন স্মিথ

1
আমি উভয় জিজ্ঞাসা কাজ করতে পারে না। অন্য কেউ ত্রুটি বার্তাটি পেয়েছে "মেটাডাটা নির্ধারণ করা যায়নি কারণ বিবৃতি প্রধানত পুনরুদ্ধার করুন ... মেটাডেটা আবিষ্কার সমর্থন করে না"? আমি বিশ্বাস করি sp_describe_first_result_setসিস্টেম এসপি পিছনে অপরাধী p আমি এখানে
Stackoverflowuser

@ স্টকওভারফ্লুউজার - দেখে মনে হচ্ছে যে আমি এটির মূলত ২০০৮ সালের উদাহরণের (পরীক্ষার MARTINPC\MSSQL2008) বিরুদ্ধে পরীক্ষা করেছি তাই সম্ভবত পরবর্তী সংস্করণে কিছু পরিবর্তন হয়েছে যার অর্থ এটি আর কাজ করে না।
মার্টিন স্মিথ

1
@ স্ট্যাকওভারফ্লুউজার, উপরোক্ত উদাহরণটি যখন সার্ভার @@ সংস্করণ <২০১২ ব্যবহার করে তখন কাজ করে; এই কোয়েরিটি সম্পাদন না করে আপনি ২০১২ সাল থেকে প্রোফাইলার এ দেখতে পাবেন: এক্সিকিউটিভ [sys] .sp_describe_first_result_set N'SET FMTONLY OFF; এক্সেক ('ডিস্ক থেকে প্রধানত পুনরুদ্ধার =' '' সি: \ প্রোগ্রাম ফাইলগুলি \ মাইক্রোসফ্ট এসকিউএল সার্ভার \ এমএসএসকিউএল 10. এমএসএসকিউএল ২০০8 \ এমএসএসকিউএল \ ব্যাকআপ \ ডিবি 1.বাক '' '' ')' ',
এনইউএল

7

কোনও ফাইল থেকে ব্যাকআপের তারিখ পেতে আমি লিখেছি এটি একটি সংস্করণ স্বাধীন এসপি।

এটি এসকিউএল ২০০৮ আরআর, ২০১২ এবং 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/489865 এবং support.microsoft.com/en-us/kb/3058865 , KeyAlgorithm / EncryptorThumbprint / EncryptorType আপনি "SQL সার্ভার 2014" জন্য যুক্ত করেছেন আসলে শুধুমাত্র এসপি 1 দেখা যায়। আমি এটির জন্য বিল্ড সংস্করণ বিশ্বাস করি 12.0.4100.1, সুতরাং কোডটি SERVERPROPERTY('ProductVersion')সঠিকভাবে পূরণের জন্য সমস্ত ক্ষেত্রের দিকে নজর দেওয়া উচিত ।
জোনব্রেভ

7

যেহেতু আপনি কেবল 'কোড' থেকে ডেটা অ্যাক্সেস সম্পর্কে জিজ্ঞাসা করেছিলেন যে কোন ধরণের কোডের কোনও বিশদ উল্লেখ না করে, আমি এখানে পাওয়ারশেলের সমাধানটি উপস্থাপন করছি :

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

1
এটি আরও ভাল, কারণ আমরা `ls | এর মতো কিছু করতে পারি % {$ _। পূর্ণ নাম} | % {আহ্বান-এসকিউএলসিএমডি-কিওয়ারি "ডিস্ক থেকে প্রধানত পুনরুদ্ধার করুন '' $ _ '"} | ফর্ম্যাট-টেবিল `
লুইজ ফিলিপ

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
এটি এসকিউএল ২০১৪-এ কাজ করার জন্য, টেবিলের শেষে আপনার এই অতিরিক্ত ক্ষেত্রগুলি থাকতে হবে:, কন্টেন্টমেন্ট টিনিন্যান্ট, কীএলগোরিদম এনভারচার (৩২), এনক্রিপটারটিম্বপ্রিন্ট ভের্বাইনারি (২০), এনক্রিপ্টর টাইপ নব্যারচার (৩২)
মাইকে

রয়েছে এই উত্তর , যা সব কিছুর জন্য varchar ব্যবহার করে না, এবং SQL সার্ভার 2014. জন্য অতিরিক্ত কলাম অন্তর্ভুক্ত
Baodad

নোট করুন যে এই অতিরিক্ত কলামগুলি আসলে এসকিউএল 2014 এসপি 1 এ যুক্ত হয়েছিল । আমি বিশ্বাস করি এটির জন্য বিল্ড সংস্করণ 12.0.4100.1
জোনব্রেভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.