Как вставить во временную таблицу информацию, предоставленную RESTORE FILELISTONLY / HEADERONLY / VERIFYONLY - PullRequest
6 голосов
/ 05 августа 2010

Как вставить набор результатов, заданный командами

RESTORE FILELISTONLY
RESTORE  HEADERONLY
RESTORE VERIFYONLY

, в автоматически сгенерированную временную таблицу?

Я хотел бы использовать метод, аналогичный (так что таблица создается автоматическисо всеми столбцами, совпадающими со столбцами набора результатов)

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

Но это не работает.Если бы я мог заполнить TempTable, я мог бы тогда использовать информацию, содержащуюся в нем, в следующем операторе SQL (в моем случае оператор восстановления БД, в котором мне нужно использовать некоторые строки, содержащиеся в наборе результатов, заданном RESTORE FILELISTONLY)

Я использую SQL Server 2008.

Ответы [ 2 ]

7 голосов
/ 05 августа 2010

Лично это один сценарий, в котором я бы избегал чистого TSQL и использовал внешний скрипт или программу.В зависимости от того, что вы пытаетесь сделать, вы можете обнаружить, что использование Smo от Powershell или .NET в любом случае полностью устраняет необходимость в 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) документация не соответствует фактическому набору результатов, поэтому вам может потребоваться настроить его.

5 голосов
/ 09 июля 2015

Я знаю, что ОП использовал 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

Обновление 18/02/2016 : SQL Server 2014 с пакетом обновления 1 добавил 3 новых столбца к выводу RESTORE HEADERONLY: KeyAlgorithm EncryptorThumbprint EncryptorType.Я добавил эти столбцы в процедуру выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...