Skip to content

Instantly share code, notes, and snippets.

@duncansmart
Created May 2, 2012 13:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save duncansmart/2576562 to your computer and use it in GitHub Desktop.
Save duncansmart/2576562 to your computer and use it in GitHub Desktop.
Restore SQL Server Database from BAK file
SET NOCOUNT ON
DECLARE @bakfile nvarchar(max) = 'C:\Temp\MyDb.BAK';
DECLARE @dbname nvarchar(max) = 'MyDb';
--DECLARE @datapath nvarchar(max) = 'c:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA';
DECLARE @datapath nvarchar(max) = (SELECT TOP(1) left(physical_name, len(physical_name) - len('\master.mdf')) FROM master.sys.database_files)
--SELECT @datapath
--Drop db if exists
IF db_id(@dbname) IS NOT NULL
BEGIN
print '* Dropping ' + @dbname + '...'
USE master;
EXEC('ALTER DATABASE [' + @dbname + '] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
DROP DATABASE [' + @dbname + ']');
END
DECLARE @filelist TABLE(
LogicalName varchar(max), PhysicalName varchar(max), Type varchar(max), FileGroupName varchar(max), Size varchar(max), MaxSize varchar(max)
, FileId varchar(max), CreateLSN varchar(max), DropLSN varchar(max), UniqueId varchar(max), ReadOnlyLSN varchar(max), ReadWriteLSN varchar(max)
, BackupSizeInBytes varchar(max), SourceBlockSize varchar(max), FileGroupId varchar(max), LogGroupGUID varchar(max), DifferentialBaseLSN varchar(max)
, DifferentialBaseGUID varchar(max), IsReadOnly varchar(max), IsPresent varchar(max), TDEThumbprint varchar(max)
)
INSERT @filelist EXEC('RESTORE FILELISTONLY FROM DISK = N'''+ @bakfile +'''')
DECLARE @sql nvarchar(max) = 'RESTORE DATABASE ['+ @dbname +']
FROM DISK = N'''+ @bakfile +'''
WITH FILE = 1 ';
--append WITH MOVEs...
SELECT @sql = @sql + char(10) + ', MOVE N''' + LogicalName + ''' TO N'''+ @datapath + '\' + @dbname
+ coalesce('_' + FileGroupName, '')
+ CASE Type WHEN 'D' THEN '.mdf' ELSE '_LOG.ldf' END
+ ''''
FROM @filelist;
PRINT '* Restoring ' + @dbname + '...'
--print @sql;
EXEC(@sql);
PRINT '* Setting to simple recovery and shrinking...'
EXEC('ALTER DATABASE [' + @dbname + '] SET RECOVERY SIMPLE');
EXEC('DBCC SHRINKDATABASE(N''' + @dbname + ''') WITH NO_INFOMSGS');
-- TODO: wire up users/logins
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment