5

कैसे resultset एक स्वत: उत्पन्न अस्थायी तालिका में आदेशोंकैसे एक अस्थायी तालिका में जानकारी द्वारा दिए गए सम्मिलित करने के लिए पुनर्स्थापित FILELISTONLY/HEADERONLY/VERIFYONLY

RESTORE FILELISTONLY 
RESTORE HEADERONLY 
RESTORE VERIFYONLY 

द्वारा दिए गए सम्मिलित करने के लिए?

मैं

SELECT * INTO #TempTable 
FROM (RESTORE FILELISTONLY FROM DISK = 'c:\Test\Test.bak') 

लेकिन यह काम नहीं करता है (सभी resultset का कॉलम मिलान कॉलम के साथ है, तो तालिका ऑटो बनाई गई है) एक तकनीक के समान का उपयोग करना चाहते हैं। यदि मैं एक TempTable पॉप्युलेट कर सकता हूं तो मैं निम्नलिखित SQL स्टेटमेंट में इसमें शामिल जानकारी का उपयोग कर सकता हूं (मेरे मामले में एक पुनर्स्थापित डीबी स्टेटमेंट जिसमें मुझे रीस्टोर FILELISTONLY द्वारा दिए गए परिणाम में निहित कुछ तारों का उपयोग करने की आवश्यकता है)

मैं एसक्यूएल सर्वर 2008 का उपयोग कर रहा हूं।

उत्तर

7

व्यक्तिगत रूप से, यह एक परिदृश्य है जहां मैं शुद्ध टीएसक्यूएल से बचूंगा और बाहरी स्क्रिप्ट या प्रोग्राम का उपयोग करूंगा। आप जो करने की कोशिश कर रहे हैं उसके आधार पर, आप पाएंगे कि पावरहेल या .NET से Smo का उपयोग करके पूरी तरह से TSQL की आवश्यकता से बचा जाता है। मैं कहता हूं कि बैकअप के साथ काम करना हमेशा डेटाबेस के बाहर फ़ाइलों के साथ काम करने का कारण बनता है, और फिर टीएसक्यूएल बहुत अजीब है।

सब है कि, अगर आप यकीन है कि आप TSQL में इस करना चाहिए रहे हैं, तो आप कुछ इस तरह कर सकते हैं कहा था:

insert into dbo.BackupFiles (LogicalName, PhysicalName, ...) 
exec('RESTORE FILELISTONLY FROM DISK = ''c:\Test\Test.bak''') 

या थोड़ा अच्छे होने के लिए:

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 

आपको अभी भी टेबल बनाना होगा, हालांकि, जो कोई बड़ा सौदा नहीं है और अगर आप ऐसा करते हैं तो वैसे भी समझ में आता है। पुस्तकें ऑनलाइन परिणाम सेट में प्रत्येक कॉलम के लिए डेटा प्रकार सूचीबद्ध करती हैं, लेकिन कम से कम मेरे लिए (SQL2008 SP1) दस्तावेज़ वास्तविक परिणाम सेट से मेल नहीं खाता है, इसलिए आपको इसे ट्विक करने की आवश्यकता हो सकती है।

+0

+1, अच्छा उत्तर –

+1

ठीक है धन्यवाद। चूंकि तालिका स्वचालित रूप से नहीं बनाई गई है, इसलिए मैं आपके सुझाव का पालन करूंगा और इसे किसी भी प्रोग्राम के साथ करूँगा, टीएसक्यूएल में नहीं। – LaBracca

4

मैं जानता हूँ कि ओ पी उपयोग कर रहा था, लेकिन हम सभी कुछ साल पर स्थानांतरित कर दिया है और मैं बस जो DatabaseBackupLSN बाहर उठाता के लिए एक संग्रहीत proc लिखा था, इसलिए सोचा कि मैं साझा करेंगे ...

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 

RESTORE HEADERONLY डॉक्स here हैं।

उदाहरण उपयोग:

DECLARE @databaseBackupLsn NUMERIC(25, 0) 

EXEC GetDatabaseBackupLsn 
    'd:\transfer\YourDatabaseBackup_2015_07_09_05_31_59.bak', 
    @databaseBackupLsn OUT 

SELECT @databaseBackupLsn 

अद्यतन 18/02/2016: KeyAlgorithmEncryptorThumbprintEncryptorType: SQL Server 2014 Service Pack 1RESTORE HEADERONLY उत्पादन में 3 नए कॉलम जोड़ा। मैंने इन कॉलम को ऊपर की प्रक्रिया में जोड़ा है।

संबंधित मुद्दे