किसी क्षेत्र से मुख्य रूप से निकालना


12

मैं उस तारीख को प्राप्त करने के लिए ORE RESTORE HEADERONLY ’ का उपयोग करने की कोशिश कर रहा हूं जब बैकअप मैं बहाल करने वाला था।

आदेश:

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

क्वेरी एनालाइज़र में ठीक काम करता है और 50 कॉलम जैसे कुछ के साथ एक परिणाम देता है।

समस्या वास्तव में इसे कोड से एक्सेस कर रही है।

मैं इसे 50: ईश स्तंभों में से हर एक को घोषित करके एक अस्थायी तालिका में प्राप्त कर सकता हूं, इसके साथ इसे सम्मिलित कर सकता 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''''
'')')

चतुर, और साझा करने के लिए धन्यवाद, लेकिन सिर्फ रिकॉर्ड के लिए मुझे लगता है कि यह उतना ही भंगुर / जटिल है जितना अंत में स्तंभों की बड़ी-सूची। शर्म की बात है कि एक सुंदर समाधान नहीं है।
टिम एबेल

@TimAbell - हां मुझे नहीं लगता कि मैं वास्तव में व्यवहार में इसका उपयोग करूंगा, शायद पहली जगह में टेबल की परिभाषा प्राप्त करने के लिए।
मार्टिन स्मिथ

1
मैं या तो क्वेरी काम नहीं कर सकता। क्या किसी और को त्रुटि संदेश मिलता है "मेटाडेटा का निर्धारण नहीं किया जा सकता है क्योंकि विवरण मुख्य रूप से ... मेटाडेटा खोज का समर्थन नहीं करता है"? मेरा मानना sp_describe_first_result_setहै कि सिस्टम सपा पीछे अपराधी है। मैं भी एक अलग टिकट के रूप में यह सवाल उठाया यहाँ
Stackoverflowuser

@Stackoverflowuser - ऐसा लगता है कि मैंने मूल रूप से 2008 के उदाहरण (से MARTINPC\MSSQL2008) के खिलाफ इसका परीक्षण किया है, इसलिए हो सकता है कि बाद के संस्करणों में कुछ बदल गया है, जिसका अर्थ है कि यह अब काम नहीं करता है।
मार्टिन स्मिथ

1
@Stackoverflowuser, उपरोक्त उदाहरण तब काम करता है जब सर्वर @@ संस्करण <2012. 2012 से शुरू होता है, इस क्वेरी को निष्पादित करने के बजाय, आप Profiler में इस एक को देख सकते हैं: निष्पादित करें [sys] .sp_describe_first_result_set N'SET FMTONLY OFF; EXEC ('' पहले से अधिक DISK = '' 'C: \ Program Files \ Microsoft SQL Server \ MSSQL10.MSSQL2008 \ MSSQL \ Backup \ DB1.bak' '' '' '' ')' '' '' '' '' '' R R ULL R R R R R R R R R ULL ’’ ’’ ’’, NULL, 1
सिपुपिक

7

यह एक स्वतंत्र संस्करण है जिसे मैंने एक फ़ाइल से बैकअप दिनांक प्राप्त करने के लिए लिखा था।

यह 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/489865 और support.microsoft.com/en-us/kb/3058865 , KeyAlgorithm / EncryptorThumbprint / EncryptorType आप "एसक्यूएल सर्वर 2014" के लिए शामिल किया है वास्तव में केवल SP1 में दिखाई दिया। मेरा मानना ​​है कि इसके लिए बिल्ड वर्जन है 12.0.4100.1, इसलिए कोड को उसके लिए SERVERPROPERTY('ProductVersion')सही ढंग से पूरा करने के लिए सभी क्षेत्रों को देखना चाहिए ।
जॉनब्रेव

7

जब से तुम ही क्या कोड की तरह किसी भी जानकारी निर्दिष्ट किए बिना 'कोड' से डेटा तक पहुँचने के बारे में पूछा, मैं इसके द्वारा पेश PowerShell समाधान:

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

1
यह और भी बेहतर है, क्योंकि हम कुछ ऐसा कर सकते हैं जैसे `एलएस | % {$ _। fullname} | % {invoke-sqlcmd -Query "" मुख्य रूप से 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 में काम करने के लिए, आपको टेबल के अंत में इन अतिरिक्त फ़ील्ड्स की आवश्यकता होगी: कंटेनर टिंटिंट, कीअलगोरिथम नवरचेर (32), एनक्रिप्ट्रीथंबप्रिंट वर्बिनरी (20), एनक्रिप्ट्रिपटाइप एनवरचर (32)
माइक

यह उत्तर भी है , जो सब कुछ के लिए varchar का उपयोग नहीं करता है, और इसमें SQL Server 2014 के लिए अतिरिक्त कॉलम शामिल हैं।
Baodad

ध्यान दें कि ये अतिरिक्त कॉलम वास्तव में SQL 2014 SP1 में जोड़े गए थे । मेरा मानना ​​है कि इसके लिए बिल्ड वर्जन है 12.0.4100.1
जॉनब्रावे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.