2010-08-05 35 views
5

如何插入由命令如何插入到一個臨時表給出的信息RESTORE FILELISTONLY/HEADERONLY/VERIFYONLY

RESTORE FILELISTONLY 
RESTORE HEADERONLY 
RESTORE VERIFYONLY 

給到自動生成的臨時表中的結果?

我想用類似的技術(所以自動創建表,匹配結果集的列中的所有列)

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

但是,這是行不通的。如果我可以填充一個TempTable,那麼我可以在後面的SQL語句中使用它所包含的信息(在我的例子中是一個恢復DB語句,我需要使用RESTORE FILELISTONLY給出的結果集中包含的一些字符串)

我正在使用sql server 2008.

回答

7

就我個人而言,這是一種避免使用純TSQL並使用外部腳本或程序的場景。根據你想要做的事情,你可能會發現從Powershell或.NET使用Smo完全避免了TSQL的需要。我說這是因爲使用備份似乎總是會導致在數據庫之外使用文件,然後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,很好回答 – 2010-08-05 12:01:56

+1

好的,謝謝。由於表格不是自動創建的,因此我會按照您的建議進行操作,無論如何都要使用程序來完成,而不是TSQL。 – LaBracca 2010-08-05 12:35:34

4

我知道OP使用,但我們都搬到上了幾年,我只是寫了一個存儲過程爲其中挑選出DatabaseBackupLSN,所以以爲我會分享...

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 docs是here

實例:

DECLARE @databaseBackupLsn NUMERIC(25, 0) 

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

SELECT @databaseBackupLsn 

更新18/02/2016SQL Server 2014 Service Pack 1加入3-新列到RESTORE HEADERONLY輸出:KeyAlgorithmEncryptorThumbprintEncryptorType。我已經將這些列添加到上面的過程中。