可以使用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 或其他合理唯一的标识符附加到新文件名。