这是可能得到的备份数据文件的细节通过使用RESTORE FILELISTONLY
。
您可以将此信息放入可用于通过将其插入临时表或表变量中来构建恢复语句的表中。要将它集成到您现有的代码中:
DECLARE @fileListTable TABLE
(
LogicalName NVARCHAR(128),
PhysicalName NVARCHAR(260),
[Type] CHAR(1),
FileGroupName NVARCHAR(128),
SIZE NUMERIC(20,0),
MaxSize NUMERIC(20,0),
FileID BIGINT,
CreateLSN NUMERIC(25,0),
DropLSN NUMERIC(25,0),
UniqueID UNIQUEIDENTIFIER,
ReadOnlyLSN NUMERIC(25,0),
ReadWriteLSN NUMERIC(25,0),
BackupSizeInBytes BIGINT,
SourceBlockSize INT,
FileGroupID INT,
LogGroupGUID UNIQUEIDENTIFIER,
DifferentialBaseLSN NUMERIC(25,0),
DifferentialBaseGUID UNIQUEIDENTIFIER,
IsReadOnly BIT,
IsPresent BIT,
TDEThumbprint VARBINARY(32)
)
--This schema works from SQL 2008 to SQL 2014.
--SQL 2005 didn't have the TDEThumbprint column, but is otherwise the same.
INSERT INTO @fileListTable EXEC('restore filelistonly
FROM DISK = N''%BACKUPFILENAME%''')
DECLARE @datafile NVARCHAR(128), @logfile NVARCHAR(128)
SELECT @datafile = LogicalName FROM @fileListTable WHERE Type = 'D'
SELECT @logfile = LogicalName FROM @fileListTable WHERE Type = 'L'
RESTORE DATABASE [%NewDB%]
FROM DISK = N'%BACKUPFILENAME%'
WITH RECOVERY,
MOVE @datafile TO N'C:\%NewDB%.mdf',
MOVE @logfile TO N'C:\%NewDB%_Log.ldf'
在具有更多数据/日志文件的情况下,代码需要相应更复杂。
解决冲突文件名可能性的一种方法是将时间戳,GUID或其他合理唯一的标识符附加到新文件名。