SET NOCOUNT ON
DECLARE 
@dbname Varchar(100) = 'Ax2012',
@physicalpath Varchar(500) = N'J:\MSSQL_BACKUP\AX2012DB.bak',    

@DataFileLocation Varchar(255) = N'G:\MSSQL_DATA' ,
@LogFileLocation Varchar(255) = N'H:\MSSQL_LOGS' 
              
DECLARE @BackupDate Date ,
        @cmd nvarchar(max) ,
        @logicalname Varchar(255) ,
        @PhysicalFileName Varchar(max) ,
        @type Varchar(5)
          
  
-- If data file location is not specified then data files will be restored to default data file location.     
IF @DataFileLocation IS NULL
    SELECT @DataFileLocation = SUBSTRING(physical_name, 1,CHARINDEX(N'master.mdf',LOWER(physical_name)) - 2)  FROM master.sys.master_files WHERE database_id = 1 AND FILE_ID = 1
-- If log file location is not specified then log files will be restored to default log file location.    
IF @LogFileLocation IS NULL
    SELECT @LogFileLocation =  SUBSTRING(physical_name, 1,CHARINDEX(N'mastlog.ldf',LOWER(physical_name)) - 2)  FROM master.sys.master_files WHERE database_id = 1 AND FILE_ID = 2
  
CREATE TABLE #filelist (
   LogicalName VARCHAR(255),
   PhysicalName VARCHAR(500),
   [Type] VARCHAR(1),
   FileGroupName VARCHAR(64),
   Size DECIMAL(20, 0),
   MaxSize DECIMAL(25,0),
   FileID bigint,
   CreateLSN DECIMAL(25,0),
   DropLSN DECIMAL(25,0),
   UniqueID UNIQUEIDENTIFIER,
   ReadOnlyLSN DECIMAL(25,0),
   ReadWriteLSN DECIMAL(25,0),
   BackupSizeInBytes DECIMAL(25,0),
   SourceBlockSize INT,
   filegroupid INT,
   loggroupguid UNIQUEIDENTIFIER,
   differentialbaseLSN DECIMAL(25,0),
   differentialbaseGUID UNIQUEIDENTIFIER,
   isreadonly BIT,
   ispresent BIT ,
   TDEThumbprint Varchar(255),
   SnapshotURL varchar(255))
  
  



BEGIN
    -- If database is not already there then go through the filelist and move to appropriate locations.
    SET @cmd = 'RESTORE FILELISTONLY FROM  DISK= '''+ @physicalpath +''''
    INSERT INTO #filelist
    EXEC (@cmd)
              
    SET @cmd =  'RESTORE DATABASE ['+ @dbname +']  FROM DISK = '''+ @physicalpath +''' WITH STATS = 1 ,   '
              
    DECLARE file_list cursor for
    SELECT LogicalName, PhysicalName, Type FROM #filelist ORDER BY type
    OPEN file_list
    FETCH NEXT FROM  file_list into @LogicalName, @PhysicalFileName, @type
    WHILE @@fetch_status = 0
        BEGIN
            -- If it is data file move to data file location.
            IF @type = 'D'
                SET @cmd = @cmd + ' MOVE ''' + @LogicalName + '''' + ' TO ''' + @DataFileLocation  +'\'+   Substring(@PhysicalFileName , LEN(@PhysicalFileName)-CHARINDEX('\' , REVERSE(@PhysicalFileName))+2 , CHARINDEX('\' , REVERSE(@PhysicalFileName))) + ''','
            ELSE
            -- Log files move to log file location.
                SET @cmd = @cmd + ' MOVE ''' + @LogicalName + '''' + ' TO ''' + @LogFileLocation  + '\'+  Substring(@PhysicalFileName , LEN(@PhysicalFileName)-CHARINDEX('\' , REVERSE(@PhysicalFileName))+2 , CHARINDEX('\' , REVERSE(@PhysicalFileName))) + ''''
              
    FETCH NEXT FROM  file_list into @LogicalName, @PhysicalFileName, @type    
    END
    CLOSE file_list 
    DEALLOCATE file_list
    truncate table #filelist
    Exec sp_executesql @cmd
END
      
  
drop table #filelist

ALTER DATABASE [axdb] MODIFY NAME = [axdb_orig]
ALTER DATABASE [AX2012] MODIFY NAME = [axdb]