Я должен был сделать это сам, и в итоге я скомбинировал несколько ответов, чтобы создать один скрипт, который восстанавливает базу данных (любую базу данных) и перераспределяет файлы. Все, что вам нужно знать, это путь к файлу резервной копии и имя новой базы данных. К сожалению, похоже, что нет кратких решений этой проблемы.
DECLARE @Source nvarchar(max) = 'C:\backup.bak'
DECLARE @RestoreDestination nvarchar(max) = 'NewDatabaseName'
--https://stackoverflow.com/a/27893494/5734516
--https://stackoverflow.com/a/4018782/5734516
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) -- remove this column if using SQL 2005
)
DECLARE @QueryCommand nvarchar(max) =
'RESTORE FILELISTONLY FROM DISK = N''' + REPLACE(@Source, '''', '''''') + ''' WITH NOUNLOAD'
INSERT INTO @fileListTable
EXEC(@QueryCommand)
--https://stackoverflow.com/a/2014673/5734516
DECLARE @filepath NVARCHAR(260)
EXEC master.dbo.xp_instance_regread
N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer',
N'DefaultData',
@filepath output, 'no_output'
DECLARE @Command nvarchar(max)
SET @Command = 'RESTORE DATABASE ' + QUOTENAME(@RestoreDestination) + ' '
+ ' FROM DISK=N''' + REPLACE(@Source, '''', '''''') + ''' '
+ 'WITH FILE=1 '
SELECT
@Command = @Command + ',MOVE N''' + REPLACE(LogicalName, '''', '''''') + ''''
+ ' TO N'''
+ REPLACE(@filepath + '\' + @RestoreDestination + case when FileID = 1 then '.mdf' when Type = 'L' then '_' + CAST(FileID as varchar(max)) + '.ldf' else '_' + CAST(FileID as varchar(max)) + '.ndf' end, '''', '''''')
+ ''''
FROM @fileListTable
SELECT @Command
EXEC(@Command)
Примечание: я знаю, что это старый пост, но он может пригодиться кому-то в будущем.