7

コマンドによって与えられた結果セットを挿入する方法

RESTORE FILELISTONLY
RESTORE  HEADERONLY
RESTORE VERIFYONLY

自動生成された一時テーブルに?

同様の手法を使用したいと思います(したがって、テーブルは自動作成され、すべての列が結果セットの列と一致します)

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

しかし、これはうまくいきません。TempTable にデータを入力できれば、それに含まれる情報を次の SQL ステートメントで使用できます (私の場合は、RESTORE FILELISTONLY によって与えられた結果セットに含まれる文字列を使用する必要がある復元 DB ステートメント)。

SQL Server 2008 を使用しています。

4

2 に答える 2

7

個人的には、これは純粋な TSQL を避けて外部スクリプトまたはプログラムを使用するシナリオの 1 つです。何をしようとしているのかによっては、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

ただし、最初にテーブルを作成する必要がありますが、これは大したことではなく、これを頻繁に行う場合でも意味があります。Books Online には、結果セットの各列のデータ型がリストされていますが、少なくとも私 (SQL2008 SP1) の場合、ドキュメントは実際の結果セットと一致しないため、微調整が必​​要になる場合があります。

于 2010-08-05T11:36:07.190 に答える
6

OPが2008を使用していたことは知っていますが、私たちは数年後に移動し、 を選択する 2014 のストアド プロシージャを作成したので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ドキュメントはこちらです

使用例:

DECLARE @databaseBackupLsn NUMERIC(25, 0) 

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

SELECT @databaseBackupLsn

2016 年 2 月 18 日更新: SQL Server 2014 Service Pack 1RESTORE HEADERONLYは、出力に 3 つの新しい列を追加しました: KeyAlgorithm EncryptorThumbprint EncryptorType。これらの列を上記の手順に追加しました。

于 2015-07-09T13:21:44.183 に答える