@@ -28,15 +28,11 @@ EXEC dbo.DatabaseRestore
28
28
@RunRecovery = 1;
29
29
*/
30
30
31
- USE [master]
31
+ IF OBJECT_ID (' dbo.sp_DatabaseRestore' ) IS NULL
32
+ EXEC (' CREATE PROCEDURE dbo.sp_DatabaseRestore AS RETURN 0;' )
32
33
GO
33
34
34
- SET ANSI_NULLS ON
35
- GO
36
- SET QUOTED_IDENTIFIER ON
37
- GO
38
-
39
- CREATE PROCEDURE [dbo].[DatabaseRestore]
35
+ ALTER PROCEDURE [dbo].[sp_DatabaseRestore]
40
36
@Database NVARCHAR (128 ), @RestoreDatabaseName NVARCHAR (128 ) = NULL , @BackupPathFull NVARCHAR (MAX ), @BackupPathLog NVARCHAR (MAX ),
41
37
@MoveFiles bit = 0 , @MoveDataDrive NVARCHAR (260 ) = NULL , @MoveLogDrive NVARCHAR (260 ) = NULL , @TestRestore bit = 0 , @RunCheckDB bit = 0 ,
42
38
@ContinueLogs bit = 0 , @RunRecovery bit = 0
@@ -46,8 +42,6 @@ SET NOCOUNT ON;
46
42
DECLARE @cmd NVARCHAR (4000 ), @sql NVARCHAR (MAX ), @LastFullBackup NVARCHAR (500 ), @BackupFile NVARCHAR (500 );
47
43
DECLARE @FileList TABLE (BackupFile NVARCHAR (255 ));
48
44
49
- DECLARE @MoveDataLocation AS NVARCHAR (500 ), @MoveDataLocationName AS NVARCHAR (500 ), @MoveLogLocation AS NVARCHAR (500 ), @MoveLogLocationName AS NVARCHAR (500 );
50
-
51
45
IF @RestoreDatabaseName IS NULL
52
46
SET @RestoreDatabaseName = @Database;
53
47
@@ -67,7 +61,6 @@ WHERE BackupFile LIKE '%.bak'
67
61
-- Get the SQL Server version number because the columns returned by RESTORE commands vary by version
68
62
-- Based on: https://www.brentozar.com/archive/2015/05/sql-server-version-detection/
69
63
-- Need to capture BuildVersion because RESTORE HEADERONLY changed with 2014 CU1, not RTM
70
- SELECT SERVERPROPERTY (' productversion' )
71
64
DECLARE @ProductVersion AS varchar (20 ) = CAST (SERVERPROPERTY (' productversion' ) AS varchar (20 ));
72
65
DECLARE @MajorVersion AS smallint = CAST (PARSENAME (@ProductVersion, 4 ) AS smallint );
73
66
DECLARE @MinorVersion AS smallint = CAST (PARSENAME (@ProductVersion, 3 ) AS smallint );
@@ -165,8 +158,8 @@ IF @MajorVersion >= 13 OR (@MajorVersion = 12 AND @BuildVersion >= 2342)
165
158
166
159
SET @HeadersSQL + = ' )' + CHAR (13 ) + CHAR (10 );
167
160
SET @HeadersSQL + = ' EXEC ('' RESTORE HEADERONLY FROM DISK='' '' {Path}'' '' '' )' ;
168
-
169
- DECLARE @MoveOption AS NVARCHAR (2000 )= ' ' ;
161
+
162
+ DECLARE @MoveOption AS NVARCHAR (MAX )= ' ' ;
170
163
171
164
IF @MoveFiles = 1
172
165
BEGIN
@@ -189,21 +182,23 @@ BEGIN
189
182
EXECUTE @sql = [dbo].[CommandExecute] @Command = @sql, @CommandType = ' RESTORE DATABASE' , @Mode = 1 , @DatabaseName = @Database, @LogToTable = ' Y' , @Execute = ' Y' ;
190
183
191
184
-- get the backup completed data so we can apply tlogs from that point forwards
185
+
192
186
SET @sql = REPLACE (@HeadersSQL, ' {Path}' , @BackupPathFull + @LastFullBackup);
193
187
PRINT @sql;
194
188
EXECUTE (@sql);
195
189
196
- DECLARE @BackupDateTime AS CHAR (15 ), @FullLastLSN numeric (25 ,0 );
190
+ DECLARE @BackupDateTime AS CHAR (15 ), @FullLastLSN NUMERIC (25 , 0 );
197
191
198
192
SELECT @BackupDateTime = RIGHT (@LastFullBackup, 19 )
199
193
200
- SELECT @FullLastLSN = CAST (LastLSN AS numeric (25 ,0 )) FROM #Headers WHERE BackupType = 1 ;
194
+ SELECT @FullLastLSN = CAST (LastLSN AS NUMERIC (25 , 0 )) FROM #Headers WHERE BackupType = 1 ;
195
+
201
196
END ;
202
197
ELSE
203
198
BEGIN
204
- DECLARE @DatabaseLastLSN BIGINT ;
199
+ DECLARE @DatabaseLastLSN NUMERIC ( 25 , 0 ) ;
205
200
206
- SELECT @DatabaseLastLSN = CAST (f .redo_start_lsn AS BIGINT )
201
+ SELECT @DatabaseLastLSN = CAST (f .redo_start_lsn AS NUMERIC ( 25 , 0 ) )
207
202
FROM master .sys .databases d
208
203
JOIN master .sys .master_files f ON d .database_id = f .database_id
209
204
WHERE d .name = @RestoreDatabaseName AND f .file_id = 1
@@ -226,7 +221,7 @@ DECLARE BackupFiles CURSOR FOR
226
221
227
222
OPEN BackupFiles;
228
223
229
- DECLARE @i tinyint = 1 , @LogFirstLSN numeric (25 ,0 ), @LogLastLSN numeric (25 ,0 );
224
+ DECLARE @i tinyint = 1 , @LogFirstLSN NUMERIC (25 , 0 ), @LogLastLSN NUMERIC (25 , 0 );
230
225
231
226
-- Loop through all the files for the database
232
227
FETCH NEXT FROM BackupFiles INTO @BackupFile;
@@ -238,7 +233,7 @@ BEGIN
238
233
PRINT @sql;
239
234
EXECUTE (@sql);
240
235
241
- SELECT @LogFirstLSN = CAST (FirstLSN AS numeric (25 ,0 )), @LogLastLSN = CAST (LastLSN AS numeric (25 ,0 )) FROM #Headers WHERE BackupType = 2 ;
236
+ SELECT @LogFirstLSN = CAST (FirstLSN AS NUMERIC (25 , 0 )), @LogLastLSN = CAST (LastLSN AS NUMERIC (25 , 0 )) FROM #Headers WHERE BackupType = 2 ;
242
237
243
238
IF (@ContinueLogs = 0 AND @LogFirstLSN <= @FullLastLSN AND @FullLastLSN <= @LogLastLSN) OR (@ContinueLogs = 1 AND @LogFirstLSN <= @DatabaseLastLSN AND @DatabaseLastLSN < @LogLastLSN)
244
239
SET @i = 2 ;
0 commit comments