2010-08-05 22 views
5

Làm thế nào để chèn resultset được đưa ra bởi lệnhLàm thế nào để chèn vào một bảng tạm thời các thông tin do RESTORE FILELISTONLY/HEADERONLY/VERIFYONLY

RESTORE FILELISTONLY 
RESTORE HEADERONLY 
RESTORE VERIFYONLY 

vào một bảng tạm thời tự động tạo ra?

Tôi muốn sử dụng một kỹ thuật tương tự như (vì vậy bảng được tự động tạo ra, với tất cả các cột phù hợp với cột của resultset)

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

Nhưng điều này không làm việc. Nếu tôi có thể điền một TempTable thì tôi có thể sử dụng thông tin chứa trong nó trong một câu lệnh SQL sau đây (trong trường hợp của tôi là một câu lệnh DB khôi phục mà tôi cần sử dụng một số chuỗi trong resultset được cung cấp bởi RESTORE FILELISTONLY)

Tôi đang sử dụng máy chủ sql 2008.

Trả lời

7

Cá nhân, đây là một kịch bản mà tôi sẽ tránh TSQL tinh khiết và sử dụng tập lệnh hoặc chương trình bên ngoài. Tùy thuộc vào những gì bạn đang cố gắng làm, bạn có thể thấy rằng bằng cách sử dụng Smo từ Powershell hoặc .NET hoàn toàn tránh sự cần thiết cho TSQL anyway. Tôi nói rằng bởi vì làm việc với các bản sao lưu luôn có vẻ dẫn đến làm việc với các tệp bên ngoài cơ sở dữ liệu, và sau đó TSQL chỉ là quá khó xử.

Có nói tất cả những gì, nếu bạn chắc chắn rằng bạn phải làm điều này trong TSQL, sau đó bạn có thể làm một cái gì đó như thế này:

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

Hoặc là một chút đẹp hơn:

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 

Bạn vẫn sẽ phải tạo bảng đầu tiên, mặc dù, đó là không có vấn đề lớn và có ý nghĩa anyway nếu bạn làm điều này rất nhiều. Sách trực tuyến liệt kê các loại dữ liệu cho mỗi cột trong tập kết quả, nhưng ít nhất là đối với tôi (SQL2008 SP1) tài liệu không khớp với tập kết quả thực tế để bạn có thể cần phải tinh chỉnh nó.

+0

+1, câu trả lời hay –

+1

Ok cảm ơn. Vì bảng không được tạo tự động, tôi sẽ theo gợi ý của bạn và làm điều này với một chương trình, chứ không phải trong TSQL. – LaBracca

4

Tôi biết OP đã sử dụng , nhưng tất cả chúng tôi đã chuyển về một vài năm và tôi chỉ viết một proc lưu trữ cho mà chọn ra DatabaseBackupLSN, vì vậy nghĩ tôi sẽ chia sẻ ...

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 

Tài liệu RESTORE HEADERONLYhere.

Ví dụ sử dụng:

DECLARE @databaseBackupLsn NUMERIC(25, 0) 

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

SELECT @databaseBackupLsn 

Cập nhật 18/02/2016: SQL Server 2014 Service Pack 1 thêm 3 cột mới cho RESTORE HEADERONLY đầu ra: KeyAlgorithmEncryptorThumbprintEncryptorType. Tôi đã thêm các cột này vào quy trình trên.

Các vấn đề liên quan