· 5 years ago · Mar 25, 2020, 07:30 AM
1/*
2
3SQL Server Maintenance Solution - SQL Server 2005, SQL Server 2008, SQL Server 2008 R2, SQL Server 2012, SQL Server 2014, SQL Server 2016, and SQL Server 2017
4
5Backup: https://ola.hallengren.com/sql-server-backup.html
6Integrity Check: https://ola.hallengren.com/sql-server-integrity-check.html
7Index and Statistics Maintenance: https://ola.hallengren.com/sql-server-index-and-statistics-maintenance.html
8
9License: https://ola.hallengren.com/license.html
10
11GitHub: https://github.com/olahallengren/sql-server-maintenance-solution
12
13Version: 2019-04-28 16:40:00
14
15You can contact me by e-mail at ola@hallengren.com.
16
17Ola Hallengren
18https://ola.hallengren.com
19
20***Relativity ODA LLC changes to the default script from his website***
21 - SQL jobs are not automatically created for all of the available tasks included in this script (line 37)
22 - but feel free to let this script create the additional jobs around DBCC checks, etc. if interested
23
24*/
25
26USE [master] -- Specify the database in which the objects will be created.
27
28SET NOCOUNT ON
29
30DECLARE @CreateJobs nvarchar(max)
31DECLARE @BackupDirectory nvarchar(max)
32DECLARE @CleanupTime int
33DECLARE @OutputFileDirectory nvarchar(max)
34DECLARE @LogToTable nvarchar(max)
35DECLARE @ErrorMessage nvarchar(max)
36
37SET @CreateJobs = 'N' -- Specify whether jobs should be created.
38SET @BackupDirectory = NULL -- Specify the backup root directory. If no directory is specified, the default backup directory is used.
39SET @CleanupTime = NULL -- Time in hours, after which backup files are deleted. If no time is specified, then no backup files are deleted.
40SET @OutputFileDirectory = NULL -- Specify the output file directory. If no directory is specified, then the SQL Server error log directory is used.
41SET @LogToTable = 'Y' -- Log commands to a table.
42
43IF IS_SRVROLEMEMBER('sysadmin') = 0 AND NOT (DB_ID('rdsadmin') IS NOT NULL AND SUSER_SNAME(0x01) = 'rdsa')
44BEGIN
45 SET @ErrorMessage = 'You need to be a member of the SysAdmin server role to install the SQL Server Maintenance Solution.'
46 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
47END
48
49IF NOT (SELECT [compatibility_level] FROM sys.databases WHERE database_id = DB_ID()) >= 90
50BEGIN
51 SET @ErrorMessage = 'The database ' + QUOTENAME(DB_NAME(DB_ID())) + ' has to be in compatibility level 90 or higher.'
52 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
53END
54
55IF OBJECT_ID('tempdb..#Config') IS NOT NULL DROP TABLE #Config
56
57CREATE TABLE #Config ([Name] nvarchar(max),
58 [Value] nvarchar(max))
59
60INSERT INTO #Config ([Name], [Value]) VALUES('CreateJobs', @CreateJobs)
61INSERT INTO #Config ([Name], [Value]) VALUES('BackupDirectory', @BackupDirectory)
62INSERT INTO #Config ([Name], [Value]) VALUES('CleanupTime', @CleanupTime)
63INSERT INTO #Config ([Name], [Value]) VALUES('OutputFileDirectory', @OutputFileDirectory)
64INSERT INTO #Config ([Name], [Value]) VALUES('LogToTable', @LogToTable)
65INSERT INTO #Config ([Name], [Value]) VALUES('DatabaseName', DB_NAME(DB_ID()))
66GO
67SET ANSI_NULLS ON
68GO
69SET QUOTED_IDENTIFIER ON
70GO
71IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[CommandLog]') AND type in (N'U'))
72BEGIN
73CREATE TABLE [dbo].[CommandLog](
74 [ID] [int] IDENTITY(1,1) NOT NULL,
75 [DatabaseName] [sysname] NULL,
76 [SchemaName] [sysname] NULL,
77 [ObjectName] [sysname] NULL,
78 [ObjectType] [char](2) NULL,
79 [IndexName] [sysname] NULL,
80 [IndexType] [tinyint] NULL,
81 [StatisticsName] [sysname] NULL,
82 [PartitionNumber] [int] NULL,
83 [ExtendedInfo] [xml] NULL,
84 [Command] [nvarchar](max) NOT NULL,
85 [CommandType] [nvarchar](60) NOT NULL,
86 [StartTime] [datetime] NOT NULL,
87 [EndTime] [datetime] NULL,
88 [ErrorNumber] [int] NULL,
89 [ErrorMessage] [nvarchar](max) NULL,
90 CONSTRAINT [PK_CommandLog] PRIMARY KEY CLUSTERED
91(
92 [ID] ASC
93)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
94)
95END
96GO
97SET ANSI_NULLS ON
98GO
99SET QUOTED_IDENTIFIER ON
100GO
101IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[CommandExecute]') AND type in (N'P', N'PC'))
102BEGIN
103EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[CommandExecute] AS'
104END
105GO
106ALTER PROCEDURE [dbo].[CommandExecute]
107
108@Command nvarchar(max),
109@CommandType nvarchar(max),
110@Mode int,
111@Comment nvarchar(max) = NULL,
112@DatabaseName nvarchar(max) = NULL,
113@SchemaName nvarchar(max) = NULL,
114@ObjectName nvarchar(max) = NULL,
115@ObjectType nvarchar(max) = NULL,
116@IndexName nvarchar(max) = NULL,
117@IndexType int = NULL,
118@StatisticsName nvarchar(max) = NULL,
119@PartitionNumber int = NULL,
120@ExtendedInfo xml = NULL,
121@LockMessageSeverity int = 16,
122@LogToTable nvarchar(max),
123@Execute nvarchar(max)
124
125AS
126
127BEGIN
128
129 ----------------------------------------------------------------------------------------------------
130 --// Source: https://ola.hallengren.com //--
131 --// License: https://ola.hallengren.com/license.html //--
132 --// GitHub: https://github.com/olahallengren/sql-server-maintenance-solution //--
133 --// Version: 2019-04-28 16:40:00 //--
134 ----------------------------------------------------------------------------------------------------
135
136 SET NOCOUNT ON
137
138 DECLARE @StartMessage nvarchar(max)
139 DECLARE @EndMessage nvarchar(max)
140 DECLARE @ErrorMessage nvarchar(max)
141 DECLARE @ErrorMessageOriginal nvarchar(max)
142 DECLARE @Severity int
143
144 DECLARE @StartTime datetime
145 DECLARE @EndTime datetime
146
147 DECLARE @StartTimeSec datetime
148 DECLARE @EndTimeSec datetime
149
150 DECLARE @ID int
151
152 DECLARE @Error int
153 DECLARE @ReturnCode int
154
155 DECLARE @EmptyLine nvarchar(max)
156
157 SET @Error = 0
158 SET @ReturnCode = 0
159
160 SET @EmptyLine = CHAR(9)
161
162 ----------------------------------------------------------------------------------------------------
163 --// Check core requirements //--
164 ----------------------------------------------------------------------------------------------------
165
166 IF NOT (SELECT [compatibility_level] FROM sys.databases WHERE database_id = DB_ID()) >= 90
167 BEGIN
168 SET @ErrorMessage = 'The database ' + QUOTENAME(DB_NAME(DB_ID())) + ' has to be in compatibility level 90 or higher.'
169 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
170 SET @Error = @@ERROR
171 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
172 END
173
174 IF NOT (SELECT uses_ansi_nulls FROM sys.sql_modules WHERE [object_id] = @@PROCID) = 1
175 BEGIN
176 SET @ErrorMessage = 'ANSI_NULLS has to be set to ON for the stored procedure.'
177 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
178 SET @Error = @@ERROR
179 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
180 END
181
182 IF NOT (SELECT uses_quoted_identifier FROM sys.sql_modules WHERE [object_id] = @@PROCID) = 1
183 BEGIN
184 SET @ErrorMessage = 'QUOTED_IDENTIFIER has to be set to ON for the stored procedure.'
185 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
186 SET @Error = @@ERROR
187 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
188 END
189
190 IF @LogToTable = 'Y' AND NOT EXISTS (SELECT * FROM sys.objects objects INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] WHERE objects.[type] = 'U' AND schemas.[name] = 'dbo' AND objects.[name] = 'CommandLog')
191 BEGIN
192 SET @ErrorMessage = 'The table CommandLog is missing. Download https://ola.hallengren.com/scripts/CommandLog.sql.'
193 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
194 SET @Error = @@ERROR
195 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
196 END
197
198 IF @Error <> 0
199 BEGIN
200 SET @ReturnCode = @Error
201 GOTO ReturnCode
202 END
203
204 ----------------------------------------------------------------------------------------------------
205 --// Check input parameters //--
206 ----------------------------------------------------------------------------------------------------
207
208 IF @Command IS NULL OR @Command = ''
209 BEGIN
210 SET @ErrorMessage = 'The value for the parameter @Command is not supported.'
211 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
212 SET @Error = @@ERROR
213 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
214 END
215
216 IF @CommandType IS NULL OR @CommandType = '' OR LEN(@CommandType) > 60
217 BEGIN
218 SET @ErrorMessage = 'The value for the parameter @CommandType is not supported.'
219 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
220 SET @Error = @@ERROR
221 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
222 END
223
224 IF @Mode NOT IN(1,2) OR @Mode IS NULL
225 BEGIN
226 SET @ErrorMessage = 'The value for the parameter @Mode is not supported.'
227 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
228 SET @Error = @@ERROR
229 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
230 END
231
232 IF @LockMessageSeverity NOT IN(10,16) OR @LockMessageSeverity IS NULL
233 BEGIN
234 SET @ErrorMessage = 'The value for the parameter @LockMessageSeverity is not supported.'
235 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
236 SET @Error = @@ERROR
237 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
238 END
239
240 IF @LogToTable NOT IN('Y','N') OR @LogToTable IS NULL
241 BEGIN
242 SET @ErrorMessage = 'The value for the parameter @LogToTable is not supported.'
243 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
244 SET @Error = @@ERROR
245 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
246 END
247
248 IF @Execute NOT IN('Y','N') OR @Execute IS NULL
249 BEGIN
250 SET @ErrorMessage = 'The value for the parameter @Execute is not supported.'
251 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
252 SET @Error = @@ERROR
253 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
254 END
255
256 IF @Error <> 0
257 BEGIN
258 SET @ReturnCode = @Error
259 GOTO ReturnCode
260 END
261
262 ----------------------------------------------------------------------------------------------------
263 --// Log initial information //--
264 ----------------------------------------------------------------------------------------------------
265
266 SET @StartTime = GETDATE()
267 SET @StartTimeSec = CONVERT(datetime,CONVERT(nvarchar,@StartTime,120),120)
268
269 SET @StartMessage = 'Date and time: ' + CONVERT(nvarchar,@StartTimeSec,120)
270 RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT
271
272 SET @StartMessage = 'Command: ' + @Command
273 RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT
274
275 IF @Comment IS NOT NULL
276 BEGIN
277 SET @StartMessage = 'Comment: ' + @Comment
278 RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT
279 END
280
281 IF @LogToTable = 'Y'
282 BEGIN
283 INSERT INTO dbo.CommandLog (DatabaseName, SchemaName, ObjectName, ObjectType, IndexName, IndexType, StatisticsName, PartitionNumber, ExtendedInfo, CommandType, Command, StartTime)
284 VALUES (@DatabaseName, @SchemaName, @ObjectName, @ObjectType, @IndexName, @IndexType, @StatisticsName, @PartitionNumber, @ExtendedInfo, @CommandType, @Command, @StartTime)
285 END
286
287 SET @ID = SCOPE_IDENTITY()
288
289 ----------------------------------------------------------------------------------------------------
290 --// Execute command //--
291 ----------------------------------------------------------------------------------------------------
292
293 IF @Mode = 1 AND @Execute = 'Y'
294 BEGIN
295 EXECUTE(@Command)
296 SET @Error = @@ERROR
297 SET @ReturnCode = @Error
298 END
299
300 IF @Mode = 2 AND @Execute = 'Y'
301 BEGIN
302 BEGIN TRY
303 EXECUTE(@Command)
304 END TRY
305 BEGIN CATCH
306 SET @Error = ERROR_NUMBER()
307 SET @ErrorMessageOriginal = ERROR_MESSAGE()
308
309 SET @ErrorMessage = 'Msg ' + CAST(ERROR_NUMBER() AS nvarchar) + ', ' + ISNULL(ERROR_MESSAGE(),'')
310 SET @Severity = CASE WHEN ERROR_NUMBER() IN(1205,1222) THEN @LockMessageSeverity ELSE 16 END
311 RAISERROR('%s',@Severity,1,@ErrorMessage) WITH NOWAIT
312
313 IF NOT (ERROR_NUMBER() IN(1205,1222) AND @LockMessageSeverity = 10)
314 BEGIN
315 SET @ReturnCode = ERROR_NUMBER()
316 END
317 END CATCH
318 END
319
320 ----------------------------------------------------------------------------------------------------
321 --// Log completing information //--
322 ----------------------------------------------------------------------------------------------------
323
324 SET @EndTime = GETDATE()
325 SET @EndTimeSec = CONVERT(datetime,CONVERT(varchar,@EndTime,120),120)
326
327 SET @EndMessage = 'Outcome: ' + CASE WHEN @Execute = 'N' THEN 'Not Executed' WHEN @Error = 0 THEN 'Succeeded' ELSE 'Failed' END
328 RAISERROR('%s',10,1,@EndMessage) WITH NOWAIT
329
330 SET @EndMessage = 'Duration: ' + CASE WHEN DATEDIFF(ss,@StartTimeSec, @EndTimeSec)/(24*3600) > 0 THEN CAST(DATEDIFF(ss,@StartTimeSec, @EndTimeSec)/(24*3600) AS nvarchar) + '.' ELSE '' END + CONVERT(nvarchar,@EndTimeSec - @StartTimeSec,108)
331 RAISERROR('%s',10,1,@EndMessage) WITH NOWAIT
332
333 SET @EndMessage = 'Date and time: ' + CONVERT(nvarchar,@EndTimeSec,120)
334 RAISERROR('%s',10,1,@EndMessage) WITH NOWAIT
335
336 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
337
338 IF @LogToTable = 'Y'
339 BEGIN
340 UPDATE dbo.CommandLog
341 SET EndTime = @EndTime,
342 ErrorNumber = CASE WHEN @Execute = 'N' THEN NULL ELSE @Error END,
343 ErrorMessage = @ErrorMessageOriginal
344 WHERE ID = @ID
345 END
346
347 ReturnCode:
348 IF @ReturnCode <> 0
349 BEGIN
350 RETURN @ReturnCode
351 END
352
353 ----------------------------------------------------------------------------------------------------
354
355END
356GO
357SET ANSI_NULLS ON
358GO
359SET QUOTED_IDENTIFIER ON
360GO
361IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[DatabaseBackup]') AND type in (N'P', N'PC'))
362BEGIN
363EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[DatabaseBackup] AS'
364END
365GO
366ALTER PROCEDURE [dbo].[DatabaseBackup]
367
368@Databases nvarchar(max) = NULL,
369@Directory nvarchar(max) = NULL,
370@BackupType nvarchar(max),
371@Verify nvarchar(max) = 'N',
372@CleanupTime int = NULL,
373@CleanupMode nvarchar(max) = 'AFTER_BACKUP',
374@Compress nvarchar(max) = NULL,
375@CopyOnly nvarchar(max) = 'N',
376@ChangeBackupType nvarchar(max) = 'N',
377@BackupSoftware nvarchar(max) = NULL,
378@CheckSum nvarchar(max) = 'N',
379@BlockSize int = NULL,
380@BufferCount int = NULL,
381@MaxTransferSize int = NULL,
382@NumberOfFiles int = NULL,
383@CompressionLevel int = NULL,
384@Description nvarchar(max) = NULL,
385@Threads int = NULL,
386@Throttle int = NULL,
387@Encrypt nvarchar(max) = 'N',
388@EncryptionAlgorithm nvarchar(max) = NULL,
389@ServerCertificate nvarchar(max) = NULL,
390@ServerAsymmetricKey nvarchar(max) = NULL,
391@EncryptionKey nvarchar(max) = NULL,
392@ReadWriteFileGroups nvarchar(max) = 'N',
393@OverrideBackupPreference nvarchar(max) = 'N',
394@NoRecovery nvarchar(max) = 'N',
395@URL nvarchar(max) = NULL,
396@Credential nvarchar(max) = NULL,
397@MirrorDirectory nvarchar(max) = NULL,
398@MirrorCleanupTime int = NULL,
399@MirrorCleanupMode nvarchar(max) = 'AFTER_BACKUP',
400@MirrorURL nvarchar(max) = NULL,
401@AvailabilityGroups nvarchar(max) = NULL,
402@Updateability nvarchar(max) = 'ALL',
403@AdaptiveCompression nvarchar(max) = NULL,
404@ModificationLevel int = NULL,
405@LogSizeSinceLastLogBackup int = NULL,
406@TimeSinceLastLogBackup int = NULL,
407@DataDomainBoostHost nvarchar(max) = NULL,
408@DataDomainBoostUser nvarchar(max) = NULL,
409@DataDomainBoostDevicePath nvarchar(max) = NULL,
410@DataDomainBoostLockboxPath nvarchar(max) = NULL,
411@DirectoryStructure nvarchar(max) = '{ServerName}${InstanceName}{DirectorySeparator}{DatabaseName}{DirectorySeparator}{BackupType}_{Partial}_{CopyOnly}',
412@AvailabilityGroupDirectoryStructure nvarchar(max) = '{ClusterName}${AvailabilityGroupName}{DirectorySeparator}{DatabaseName}{DirectorySeparator}{BackupType}_{Partial}_{CopyOnly}',
413@FileName nvarchar(max) = '{ServerName}${InstanceName}_{DatabaseName}_{BackupType}_{Partial}_{CopyOnly}_{Year}{Month}{Day}_{Hour}{Minute}{Second}_{FileNumber}.{FileExtension}',
414@AvailabilityGroupFileName nvarchar(max) = '{ClusterName}${AvailabilityGroupName}_{DatabaseName}_{BackupType}_{Partial}_{CopyOnly}_{Year}{Month}{Day}_{Hour}{Minute}{Second}_{FileNumber}.{FileExtension}',
415@FileExtensionFull nvarchar(max) = NULL,
416@FileExtensionDiff nvarchar(max) = NULL,
417@FileExtensionLog nvarchar(max) = NULL,
418@Init nvarchar(max) = 'N',
419@DatabaseOrder nvarchar(max) = NULL,
420@DatabasesInParallel nvarchar(max) = 'N',
421@LogToTable nvarchar(max) = 'N',
422@Execute nvarchar(max) = 'Y'
423
424AS
425
426BEGIN
427
428 ----------------------------------------------------------------------------------------------------
429 --// Source: https://ola.hallengren.com //--
430 --// License: https://ola.hallengren.com/license.html //--
431 --// GitHub: https://github.com/olahallengren/sql-server-maintenance-solution //--
432 --// Version: 2019-04-28 16:40:00 //--
433 ----------------------------------------------------------------------------------------------------
434
435 SET NOCOUNT ON
436
437 DECLARE @StartMessage nvarchar(max)
438 DECLARE @EndMessage nvarchar(max)
439 DECLARE @DatabaseMessage nvarchar(max)
440 DECLARE @ErrorMessage nvarchar(max)
441
442 DECLARE @StartTime datetime
443 DECLARE @SchemaName nvarchar(max)
444 DECLARE @ObjectName nvarchar(max)
445 DECLARE @VersionTimestamp nvarchar(max)
446 DECLARE @Parameters nvarchar(max)
447
448 DECLARE @Version numeric(18,10)
449 DECLARE @HostPlatform nvarchar(max)
450 DECLARE @DirectorySeparator nvarchar(max)
451 DECLARE @AmazonRDS bit
452
453 DECLARE @Updated bit
454
455 DECLARE @Cluster nvarchar(max)
456
457 DECLARE @DefaultDirectory nvarchar(4000)
458
459 DECLARE @QueueID int
460 DECLARE @QueueStartTime datetime
461
462 DECLARE @CurrentRootDirectoryID int
463 DECLARE @CurrentRootDirectoryPath nvarchar(4000)
464
465 DECLARE @CurrentDBID int
466 DECLARE @CurrentDatabaseID int
467 DECLARE @CurrentDatabaseName nvarchar(max)
468 DECLARE @CurrentBackupType nvarchar(max)
469 DECLARE @CurrentFileExtension nvarchar(max)
470 DECLARE @CurrentFileNumber int
471 DECLARE @CurrentDifferentialBaseLSN numeric(25,0)
472 DECLARE @CurrentDifferentialBaseIsSnapshot bit
473 DECLARE @CurrentLogLSN numeric(25,0)
474 DECLARE @CurrentLatestBackup datetime
475 DECLARE @CurrentDatabaseNameFS nvarchar(max)
476 DECLARE @CurrentDirectoryStructure nvarchar(max)
477 DECLARE @CurrentDatabaseFileName nvarchar(max)
478 DECLARE @CurrentMaxFilePathLength nvarchar(max)
479 DECLARE @CurrentFileName nvarchar(max)
480 DECLARE @CurrentDirectoryID int
481 DECLARE @CurrentDirectoryPath nvarchar(max)
482 DECLARE @CurrentFilePath nvarchar(max)
483 DECLARE @CurrentDate datetime
484 DECLARE @CurrentCleanupDate datetime
485 DECLARE @CurrentIsDatabaseAccessible bit
486 DECLARE @CurrentAvailabilityGroup nvarchar(max)
487 DECLARE @CurrentAvailabilityGroupRole nvarchar(max)
488 DECLARE @CurrentAvailabilityGroupBackupPreference nvarchar(max)
489 DECLARE @CurrentIsPreferredBackupReplica bit
490 DECLARE @CurrentDatabaseMirroringRole nvarchar(max)
491 DECLARE @CurrentLogShippingRole nvarchar(max)
492 DECLARE @CurrentIsEncrypted bit
493 DECLARE @CurrentIsReadOnly bit
494 DECLARE @CurrentBackupSetID int
495 DECLARE @CurrentIsMirror bit
496 DECLARE @CurrentLastLogBackup datetime
497 DECLARE @CurrentLogSizeSinceLastLogBackup float
498 DECLARE @CurrentAllocatedExtentPageCount bigint
499 DECLARE @CurrentModifiedExtentPageCount bigint
500
501 DECLARE @CurrentCommand01 nvarchar(max)
502 DECLARE @CurrentCommand02 nvarchar(max)
503 DECLARE @CurrentCommand03 nvarchar(max)
504 DECLARE @CurrentCommand04 nvarchar(max)
505 DECLARE @CurrentCommand05 nvarchar(max)
506 DECLARE @CurrentCommand06 nvarchar(max)
507 DECLARE @CurrentCommand07 nvarchar(max)
508
509 DECLARE @CurrentCommandOutput01 int
510 DECLARE @CurrentCommandOutput02 int
511 DECLARE @CurrentCommandOutput03 int
512 DECLARE @CurrentCommandOutput04 int
513 DECLARE @CurrentCommandOutput05 int
514
515 DECLARE @CurrentCommandType01 nvarchar(max)
516 DECLARE @CurrentCommandType02 nvarchar(max)
517 DECLARE @CurrentCommandType03 nvarchar(max)
518 DECLARE @CurrentCommandType04 nvarchar(max)
519 DECLARE @CurrentCommandType05 nvarchar(max)
520
521 DECLARE @Directories TABLE (ID int PRIMARY KEY,
522 DirectoryPath nvarchar(max),
523 Mirror bit,
524 Completed bit)
525
526 DECLARE @URLs TABLE (ID int PRIMARY KEY,
527 DirectoryPath nvarchar(max),
528 Mirror bit)
529
530 DECLARE @DirectoryInfo TABLE (FileExists bit,
531 FileIsADirectory bit,
532 ParentDirectoryExists bit)
533
534 DECLARE @tmpDatabases TABLE (ID int IDENTITY,
535 DatabaseName nvarchar(max),
536 DatabaseNameFS nvarchar(max),
537 DatabaseType nvarchar(max),
538 AvailabilityGroup bit,
539 StartPosition int,
540 DatabaseSize bigint,
541 LogSizeSinceLastLogBackup float,
542 [Order] int,
543 Selected bit,
544 Completed bit,
545 PRIMARY KEY(Selected, Completed, [Order], ID))
546
547 DECLARE @tmpAvailabilityGroups TABLE (ID int IDENTITY PRIMARY KEY,
548 AvailabilityGroupName nvarchar(max),
549 StartPosition int,
550 Selected bit)
551
552 DECLARE @tmpDatabasesAvailabilityGroups TABLE (DatabaseName nvarchar(max),
553 AvailabilityGroupName nvarchar(max))
554
555 DECLARE @SelectedDatabases TABLE (DatabaseName nvarchar(max),
556 DatabaseType nvarchar(max),
557 AvailabilityGroup nvarchar(max),
558 StartPosition int,
559 Selected bit)
560
561 DECLARE @SelectedAvailabilityGroups TABLE (AvailabilityGroupName nvarchar(max),
562 StartPosition int,
563 Selected bit)
564
565 DECLARE @CurrentBackupSet TABLE (ID int IDENTITY PRIMARY KEY,
566 Mirror bit,
567 VerifyCompleted bit,
568 VerifyOutput int)
569
570 DECLARE @CurrentDirectories TABLE (ID int PRIMARY KEY,
571 DirectoryPath nvarchar(max),
572 Mirror bit,
573 DirectoryNumber int,
574 CleanupDate datetime,
575 CleanupMode nvarchar(max),
576 CreateCompleted bit,
577 CleanupCompleted bit,
578 CreateOutput int,
579 CleanupOutput int)
580
581 DECLARE @CurrentURLs TABLE (ID int PRIMARY KEY,
582 DirectoryPath nvarchar(max),
583 Mirror bit,
584 DirectoryNumber int)
585
586 DECLARE @CurrentFiles TABLE ([Type] nvarchar(max),
587 FilePath nvarchar(max),
588 Mirror bit)
589
590 DECLARE @CurrentCleanupDates TABLE (CleanupDate datetime, Mirror bit)
591
592 DECLARE @DirectoryCheck bit
593
594 DECLARE @Error int
595 DECLARE @ReturnCode int
596
597 DECLARE @EmptyLine nvarchar(max)
598
599 SET @Error = 0
600 SET @ReturnCode = 0
601
602 SET @EmptyLine = CHAR(9)
603
604 SET @Version = CAST(LEFT(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max)),CHARINDEX('.',CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max))) - 1) + '.' + REPLACE(RIGHT(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max)), LEN(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max))) - CHARINDEX('.',CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max)))),'.','') AS numeric(18,10))
605
606 IF @Version >= 14
607 BEGIN
608 SELECT @HostPlatform = host_platform
609 FROM sys.dm_os_host_info
610 END
611 ELSE
612 BEGIN
613 SET @HostPlatform = 'Windows'
614 END
615
616 SET @AmazonRDS = CASE WHEN DB_ID('rdsadmin') IS NOT NULL AND SUSER_SNAME(0x01) = 'rdsa' THEN 1 ELSE 0 END
617
618 ----------------------------------------------------------------------------------------------------
619 --// Log initial information //--
620 ----------------------------------------------------------------------------------------------------
621
622 SET @StartTime = GETDATE()
623 SET @SchemaName = (SELECT schemas.name FROM sys.schemas schemas INNER JOIN sys.objects objects ON schemas.[schema_id] = objects.[schema_id] WHERE [object_id] = @@PROCID)
624 SET @ObjectName = OBJECT_NAME(@@PROCID)
625 SET @VersionTimestamp = SUBSTRING(OBJECT_DEFINITION(@@PROCID),CHARINDEX('--// Version: ',OBJECT_DEFINITION(@@PROCID)) + LEN('--// Version: ') + 1, 19)
626
627 SET @Parameters = '@Databases = ' + ISNULL('''' + REPLACE(@Databases,'''','''''') + '''','NULL')
628 SET @Parameters = @Parameters + ', @Directory = ' + ISNULL('''' + REPLACE(@Directory,'''','''''') + '''','NULL')
629 SET @Parameters = @Parameters + ', @BackupType = ' + ISNULL('''' + REPLACE(@BackupType,'''','''''') + '''','NULL')
630 SET @Parameters = @Parameters + ', @Verify = ' + ISNULL('''' + REPLACE(@Verify,'''','''''') + '''','NULL')
631 SET @Parameters = @Parameters + ', @CleanupTime = ' + ISNULL(CAST(@CleanupTime AS nvarchar),'NULL')
632 SET @Parameters = @Parameters + ', @CleanupMode = ' + ISNULL('''' + REPLACE(@CleanupMode,'''','''''') + '''','NULL')
633 SET @Parameters = @Parameters + ', @Compress = ' + ISNULL('''' + REPLACE(@Compress,'''','''''') + '''','NULL')
634 SET @Parameters = @Parameters + ', @CopyOnly = ' + ISNULL('''' + REPLACE(@CopyOnly,'''','''''') + '''','NULL')
635 SET @Parameters = @Parameters + ', @ChangeBackupType = ' + ISNULL('''' + REPLACE(@ChangeBackupType,'''','''''') + '''','NULL')
636 SET @Parameters = @Parameters + ', @BackupSoftware = ' + ISNULL('''' + REPLACE(@BackupSoftware,'''','''''') + '''','NULL')
637 SET @Parameters = @Parameters + ', @CheckSum = ' + ISNULL('''' + REPLACE(@CheckSum,'''','''''') + '''','NULL')
638 SET @Parameters = @Parameters + ', @BlockSize = ' + ISNULL(CAST(@BlockSize AS nvarchar),'NULL')
639 SET @Parameters = @Parameters + ', @BufferCount = ' + ISNULL(CAST(@BufferCount AS nvarchar),'NULL')
640 SET @Parameters = @Parameters + ', @MaxTransferSize = ' + ISNULL(CAST(@MaxTransferSize AS nvarchar),'NULL')
641 SET @Parameters = @Parameters + ', @NumberOfFiles = ' + ISNULL(CAST(@NumberOfFiles AS nvarchar),'NULL')
642 SET @Parameters = @Parameters + ', @CompressionLevel = ' + ISNULL(CAST(@CompressionLevel AS nvarchar),'NULL')
643 SET @Parameters = @Parameters + ', @Description = ' + ISNULL('''' + REPLACE(@Description,'''','''''') + '''','NULL')
644 SET @Parameters = @Parameters + ', @Threads = ' + ISNULL(CAST(@Threads AS nvarchar),'NULL')
645 SET @Parameters = @Parameters + ', @Throttle = ' + ISNULL(CAST(@Throttle AS nvarchar),'NULL')
646 SET @Parameters = @Parameters + ', @Encrypt = ' + ISNULL('''' + REPLACE(@Encrypt,'''','''''') + '''','NULL')
647 SET @Parameters = @Parameters + ', @EncryptionAlgorithm = ' + ISNULL('''' + REPLACE(@EncryptionAlgorithm,'''','''''') + '''','NULL')
648 SET @Parameters = @Parameters + ', @ServerCertificate = ' + ISNULL('''' + REPLACE(@ServerCertificate,'''','''''') + '''','NULL')
649 SET @Parameters = @Parameters + ', @ServerAsymmetricKey = ' + ISNULL('''' + REPLACE(@ServerAsymmetricKey,'''','''''') + '''','NULL')
650 SET @Parameters = @Parameters + ', @EncryptionKey = ' + ISNULL('''' + REPLACE(@EncryptionKey,'''','''''') + '''','NULL')
651 SET @Parameters = @Parameters + ', @ReadWriteFileGroups = ' + ISNULL('''' + REPLACE(@ReadWriteFileGroups,'''','''''') + '''','NULL')
652 SET @Parameters = @Parameters + ', @OverrideBackupPreference = ' + ISNULL('''' + REPLACE(@OverrideBackupPreference,'''','''''') + '''','NULL')
653 SET @Parameters = @Parameters + ', @NoRecovery = ' + ISNULL('''' + REPLACE(@NoRecovery,'''','''''') + '''','NULL')
654 SET @Parameters = @Parameters + ', @URL = ' + ISNULL('''' + REPLACE(@URL,'''','''''') + '''','NULL')
655 SET @Parameters = @Parameters + ', @Credential = ' + ISNULL('''' + REPLACE(@Credential,'''','''''') + '''','NULL')
656 SET @Parameters = @Parameters + ', @MirrorDirectory = ' + ISNULL('''' + REPLACE(@MirrorDirectory,'''','''''') + '''','NULL')
657 SET @Parameters = @Parameters + ', @MirrorCleanupTime = ' + ISNULL(CAST(@MirrorCleanupTime AS nvarchar),'NULL')
658 SET @Parameters = @Parameters + ', @MirrorCleanupMode = ' + ISNULL('''' + REPLACE(@MirrorCleanupMode,'''','''''') + '''','NULL')
659 SET @Parameters = @Parameters + ', @MirrorURL = ' + ISNULL('''' + REPLACE(@MirrorURL,'''','''''') + '''','NULL')
660 SET @Parameters = @Parameters + ', @AvailabilityGroups = ' + ISNULL('''' + REPLACE(@AvailabilityGroups,'''','''''') + '''','NULL')
661 SET @Parameters = @Parameters + ', @Updateability = ' + ISNULL('''' + REPLACE(@Updateability,'''','''''') + '''','NULL')
662 SET @Parameters = @Parameters + ', @AdaptiveCompression = ' + ISNULL('''' + REPLACE(@AdaptiveCompression,'''','''''') + '''','NULL')
663 SET @Parameters = @Parameters + ', @ModificationLevel = ' + ISNULL(CAST(@ModificationLevel AS nvarchar),'NULL')
664 SET @Parameters = @Parameters + ', @LogSizeSinceLastLogBackup = ' + ISNULL(CAST(@LogSizeSinceLastLogBackup AS nvarchar),'NULL')
665 SET @Parameters = @Parameters + ', @TimeSinceLastLogBackup = ' + ISNULL(CAST(@TimeSinceLastLogBackup AS nvarchar),'NULL')
666 SET @Parameters = @Parameters + ', @DataDomainBoostHost = ' + ISNULL('''' + REPLACE(@DataDomainBoostHost,'''','''''') + '''','NULL')
667 SET @Parameters = @Parameters + ', @DataDomainBoostUser = ' + ISNULL('''' + REPLACE(@DataDomainBoostUser,'''','''''') + '''','NULL')
668 SET @Parameters = @Parameters + ', @DataDomainBoostDevicePath = ' + ISNULL('''' + REPLACE(@DataDomainBoostDevicePath,'''','''''') + '''','NULL')
669 SET @Parameters = @Parameters + ', @DataDomainBoostLockboxPath = ' + ISNULL('''' + REPLACE(@DataDomainBoostLockboxPath,'''','''''') + '''','NULL')
670 SET @Parameters = @Parameters + ', @DirectoryStructure = ' + ISNULL('''' + REPLACE(@DirectoryStructure,'''','''''') + '''','NULL')
671 SET @Parameters = @Parameters + ', @AvailabilityGroupDirectoryStructure = ' + ISNULL('''' + REPLACE(@AvailabilityGroupDirectoryStructure,'''','''''') + '''','NULL')
672 SET @Parameters = @Parameters + ', @FileName = ' + ISNULL('''' + REPLACE(@FileName,'''','''''') + '''','NULL')
673 SET @Parameters = @Parameters + ', @AvailabilityGroupFileName = ' + ISNULL('''' + REPLACE(@AvailabilityGroupFileName,'''','''''') + '''','NULL')
674 SET @Parameters = @Parameters + ', @FileExtensionFull = ' + ISNULL('''' + REPLACE(@FileExtensionFull,'''','''''') + '''','NULL')
675 SET @Parameters = @Parameters + ', @FileExtensionDiff = ' + ISNULL('''' + REPLACE(@FileExtensionDiff,'''','''''') + '''','NULL')
676 SET @Parameters = @Parameters + ', @FileExtensionLog = ' + ISNULL('''' + REPLACE(@FileExtensionLog,'''','''''') + '''','NULL')
677 SET @Parameters = @Parameters + ', @Init = ' + ISNULL('''' + REPLACE(@Init,'''','''''') + '''','NULL')
678 SET @Parameters = @Parameters + ', @DatabaseOrder = ' + ISNULL('''' + REPLACE(@DatabaseOrder,'''','''''') + '''','NULL')
679 SET @Parameters = @Parameters + ', @DatabasesInParallel = ' + ISNULL('''' + REPLACE(@DatabasesInParallel,'''','''''') + '''','NULL')
680 SET @Parameters = @Parameters + ', @LogToTable = ' + ISNULL('''' + REPLACE(@LogToTable,'''','''''') + '''','NULL')
681 SET @Parameters = @Parameters + ', @Execute = ' + ISNULL('''' + REPLACE(@Execute,'''','''''') + '''','NULL')
682
683 SET @StartMessage = 'Date and time: ' + CONVERT(nvarchar,@StartTime,120)
684 RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT
685
686 SET @StartMessage = 'Server: ' + CAST(SERVERPROPERTY('ServerName') AS nvarchar(max))
687 RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT
688
689 SET @StartMessage = 'Version: ' + CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max))
690 RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT
691
692 SET @StartMessage = 'Edition: ' + CAST(SERVERPROPERTY('Edition') AS nvarchar(max))
693 RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT
694
695 SET @StartMessage = 'Platform: ' + @HostPlatform
696 RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT
697
698 SET @StartMessage = 'Procedure: ' + QUOTENAME(DB_NAME(DB_ID())) + '.' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(@ObjectName)
699 RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT
700
701 SET @StartMessage = 'Parameters: ' + @Parameters
702 RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT
703
704 SET @StartMessage = 'Version: ' + @VersionTimestamp
705 RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT
706
707 SET @StartMessage = 'Source: https://ola.hallengren.com'
708 RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT
709
710 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
711
712 ----------------------------------------------------------------------------------------------------
713 --// Check core requirements //--
714 ----------------------------------------------------------------------------------------------------
715
716 IF NOT (SELECT [compatibility_level] FROM sys.databases WHERE database_id = DB_ID()) >= 90
717 BEGIN
718 SET @ErrorMessage = 'The database ' + QUOTENAME(DB_NAME(DB_ID())) + ' has to be in compatibility level 90 or higher.'
719 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
720 SET @Error = @@ERROR
721 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
722 END
723
724 IF NOT (SELECT uses_ansi_nulls FROM sys.sql_modules WHERE [object_id] = @@PROCID) = 1
725 BEGIN
726 SET @ErrorMessage = 'ANSI_NULLS has to be set to ON for the stored procedure.'
727 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
728 SET @Error = @@ERROR
729 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
730 END
731
732 IF NOT (SELECT uses_quoted_identifier FROM sys.sql_modules WHERE [object_id] = @@PROCID) = 1
733 BEGIN
734 SET @ErrorMessage = 'QUOTED_IDENTIFIER has to be set to ON for the stored procedure.'
735 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
736 SET @Error = @@ERROR
737 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
738 END
739
740 IF NOT EXISTS (SELECT * FROM sys.objects objects INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] WHERE objects.[type] = 'P' AND schemas.[name] = 'dbo' AND objects.[name] = 'CommandExecute')
741 BEGIN
742 SET @ErrorMessage = 'The stored procedure CommandExecute is missing. Download https://ola.hallengren.com/scripts/CommandExecute.sql.'
743 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
744 SET @Error = @@ERROR
745 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
746 END
747
748 IF EXISTS (SELECT * FROM sys.objects objects INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] WHERE objects.[type] = 'P' AND schemas.[name] = 'dbo' AND objects.[name] = 'CommandExecute' AND OBJECT_DEFINITION(objects.[object_id]) NOT LIKE '%@LockMessageSeverity%')
749 BEGIN
750 SET @ErrorMessage = 'The stored procedure CommandExecute needs to be updated. Download https://ola.hallengren.com/scripts/CommandExecute.sql.'
751 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
752 SET @Error = @@ERROR
753 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
754 END
755
756 IF @LogToTable = 'Y' AND NOT EXISTS (SELECT * FROM sys.objects objects INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] WHERE objects.[type] = 'U' AND schemas.[name] = 'dbo' AND objects.[name] = 'CommandLog')
757 BEGIN
758 SET @ErrorMessage = 'The table CommandLog is missing. Download https://ola.hallengren.com/scripts/CommandLog.sql.'
759 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
760 SET @Error = @@ERROR
761 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
762 END
763
764 IF @DatabasesInParallel = 'Y' AND NOT EXISTS (SELECT * FROM sys.objects objects INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] WHERE objects.[type] = 'U' AND schemas.[name] = 'dbo' AND objects.[name] = 'Queue')
765 BEGIN
766 SET @ErrorMessage = 'The table Queue is missing. Download https://ola.hallengren.com/scripts/Queue.sql.'
767 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
768 SET @Error = @@ERROR
769 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
770 END
771
772 IF @DatabasesInParallel = 'Y' AND NOT EXISTS (SELECT * FROM sys.objects objects INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] WHERE objects.[type] = 'U' AND schemas.[name] = 'dbo' AND objects.[name] = 'QueueDatabase')
773 BEGIN
774 SET @ErrorMessage = 'The table QueueDatabase is missing. Download https://ola.hallengren.com/scripts/QueueDatabase.sql.'
775 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
776 SET @Error = @@ERROR
777 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
778 END
779
780 IF @@TRANCOUNT <> 0
781 BEGIN
782 SET @ErrorMessage = 'The transaction count is not 0.'
783 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
784 SET @Error = @@ERROR
785 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
786 END
787
788 IF @AmazonRDS = 1
789 BEGIN
790 SET @ErrorMessage = 'The stored procedure DatabaseBackup is not supported on Amazon RDS.'
791 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
792 SET @Error = @@ERROR
793 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
794 END
795
796 IF @Error <> 0
797 BEGIN
798 SET @ReturnCode = @Error
799 GOTO Logging
800 END
801
802 ----------------------------------------------------------------------------------------------------
803 --// Select databases //--
804 ----------------------------------------------------------------------------------------------------
805
806 SET @Databases = REPLACE(@Databases, CHAR(10), '')
807 SET @Databases = REPLACE(@Databases, CHAR(13), '')
808
809 WHILE CHARINDEX(', ',@Databases) > 0 SET @Databases = REPLACE(@Databases,', ',',')
810 WHILE CHARINDEX(' ,',@Databases) > 0 SET @Databases = REPLACE(@Databases,' ,',',')
811
812 SET @Databases = LTRIM(RTRIM(@Databases));
813
814 WITH Databases1 (StartPosition, EndPosition, DatabaseItem) AS
815 (
816 SELECT 1 AS StartPosition,
817 ISNULL(NULLIF(CHARINDEX(',', @Databases, 1), 0), LEN(@Databases) + 1) AS EndPosition,
818 SUBSTRING(@Databases, 1, ISNULL(NULLIF(CHARINDEX(',', @Databases, 1), 0), LEN(@Databases) + 1) - 1) AS DatabaseItem
819 WHERE @Databases IS NOT NULL
820 UNION ALL
821 SELECT CAST(EndPosition AS int) + 1 AS StartPosition,
822 ISNULL(NULLIF(CHARINDEX(',', @Databases, EndPosition + 1), 0), LEN(@Databases) + 1) AS EndPosition,
823 SUBSTRING(@Databases, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(',', @Databases, EndPosition + 1), 0), LEN(@Databases) + 1) - EndPosition - 1) AS DatabaseItem
824 FROM Databases1
825 WHERE EndPosition < LEN(@Databases) + 1
826 ),
827 Databases2 (DatabaseItem, StartPosition, Selected) AS
828 (
829 SELECT CASE WHEN DatabaseItem LIKE '-%' THEN RIGHT(DatabaseItem,LEN(DatabaseItem) - 1) ELSE DatabaseItem END AS DatabaseItem,
830 StartPosition,
831 CASE WHEN DatabaseItem LIKE '-%' THEN 0 ELSE 1 END AS Selected
832 FROM Databases1
833 ),
834 Databases3 (DatabaseItem, DatabaseType, AvailabilityGroup, StartPosition, Selected) AS
835 (
836 SELECT CASE WHEN DatabaseItem IN('ALL_DATABASES','SYSTEM_DATABASES','USER_DATABASES','AVAILABILITY_GROUP_DATABASES') THEN '%' ELSE DatabaseItem END AS DatabaseItem,
837 CASE WHEN DatabaseItem = 'SYSTEM_DATABASES' THEN 'S' WHEN DatabaseItem = 'USER_DATABASES' THEN 'U' ELSE NULL END AS DatabaseType,
838 CASE WHEN DatabaseItem = 'AVAILABILITY_GROUP_DATABASES' THEN 1 ELSE NULL END AvailabilityGroup,
839 StartPosition,
840 Selected
841 FROM Databases2
842 ),
843 Databases4 (DatabaseName, DatabaseType, AvailabilityGroup, StartPosition, Selected) AS
844 (
845 SELECT CASE WHEN LEFT(DatabaseItem,1) = '[' AND RIGHT(DatabaseItem,1) = ']' THEN PARSENAME(DatabaseItem,1) ELSE DatabaseItem END AS DatabaseItem,
846 DatabaseType,
847 AvailabilityGroup,
848 StartPosition,
849 Selected
850 FROM Databases3
851 )
852 INSERT INTO @SelectedDatabases (DatabaseName, DatabaseType, AvailabilityGroup, StartPosition, Selected)
853 SELECT DatabaseName,
854 DatabaseType,
855 AvailabilityGroup,
856 StartPosition,
857 Selected
858 FROM Databases4
859 OPTION (MAXRECURSION 0)
860
861 IF @Version >= 11 AND SERVERPROPERTY('IsHadrEnabled') = 1
862 BEGIN
863 INSERT INTO @tmpAvailabilityGroups (AvailabilityGroupName, Selected)
864 SELECT name AS AvailabilityGroupName,
865 0 AS Selected
866 FROM sys.availability_groups
867
868 INSERT INTO @tmpDatabasesAvailabilityGroups (DatabaseName, AvailabilityGroupName)
869 SELECT databases.name,
870 availability_groups.name
871 FROM sys.databases databases
872 INNER JOIN sys.dm_hadr_availability_replica_states dm_hadr_availability_replica_states ON databases.replica_id = dm_hadr_availability_replica_states.replica_id
873 INNER JOIN sys.availability_groups availability_groups ON dm_hadr_availability_replica_states.group_id = availability_groups.group_id
874 END
875
876 INSERT INTO @tmpDatabases (DatabaseName, DatabaseNameFS, DatabaseType, AvailabilityGroup, [Order], Selected, Completed)
877 SELECT [name] AS DatabaseName,
878 RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE([name],'\',''),'/',''),':',''),'*',''),'?',''),'"',''),'<',''),'>',''),'|','')) AS DatabaseNameFS,
879 CASE WHEN name IN('master','msdb','model') THEN 'S' ELSE 'U' END AS DatabaseType,
880 NULL AS AvailabilityGroup,
881 0 AS [Order],
882 0 AS Selected,
883 0 AS Completed
884 FROM sys.databases
885 WHERE [name] <> 'tempdb'
886 AND source_database_id IS NULL
887 ORDER BY [name] ASC
888
889 UPDATE tmpDatabases
890 SET AvailabilityGroup = CASE WHEN EXISTS (SELECT * FROM @tmpDatabasesAvailabilityGroups WHERE DatabaseName = tmpDatabases.DatabaseName) THEN 1 ELSE 0 END
891 FROM @tmpDatabases tmpDatabases
892
893 UPDATE tmpDatabases
894 SET tmpDatabases.Selected = SelectedDatabases.Selected
895 FROM @tmpDatabases tmpDatabases
896 INNER JOIN @SelectedDatabases SelectedDatabases
897 ON tmpDatabases.DatabaseName LIKE REPLACE(SelectedDatabases.DatabaseName,'_','[_]')
898 AND (tmpDatabases.DatabaseType = SelectedDatabases.DatabaseType OR SelectedDatabases.DatabaseType IS NULL)
899 AND (tmpDatabases.AvailabilityGroup = SelectedDatabases.AvailabilityGroup OR SelectedDatabases.AvailabilityGroup IS NULL)
900 WHERE SelectedDatabases.Selected = 1
901
902 UPDATE tmpDatabases
903 SET tmpDatabases.Selected = SelectedDatabases.Selected
904 FROM @tmpDatabases tmpDatabases
905 INNER JOIN @SelectedDatabases SelectedDatabases
906 ON tmpDatabases.DatabaseName LIKE REPLACE(SelectedDatabases.DatabaseName,'_','[_]')
907 AND (tmpDatabases.DatabaseType = SelectedDatabases.DatabaseType OR SelectedDatabases.DatabaseType IS NULL)
908 AND (tmpDatabases.AvailabilityGroup = SelectedDatabases.AvailabilityGroup OR SelectedDatabases.AvailabilityGroup IS NULL)
909 WHERE SelectedDatabases.Selected = 0
910
911 UPDATE tmpDatabases
912 SET tmpDatabases.StartPosition = SelectedDatabases2.StartPosition
913 FROM @tmpDatabases tmpDatabases
914 INNER JOIN (SELECT tmpDatabases.DatabaseName, MIN(SelectedDatabases.StartPosition) AS StartPosition
915 FROM @tmpDatabases tmpDatabases
916 INNER JOIN @SelectedDatabases SelectedDatabases
917 ON tmpDatabases.DatabaseName LIKE REPLACE(SelectedDatabases.DatabaseName,'_','[_]')
918 AND (tmpDatabases.DatabaseType = SelectedDatabases.DatabaseType OR SelectedDatabases.DatabaseType IS NULL)
919 AND (tmpDatabases.AvailabilityGroup = SelectedDatabases.AvailabilityGroup OR SelectedDatabases.AvailabilityGroup IS NULL)
920 WHERE SelectedDatabases.Selected = 1
921 GROUP BY tmpDatabases.DatabaseName) SelectedDatabases2
922 ON tmpDatabases.DatabaseName = SelectedDatabases2.DatabaseName
923
924 IF @Databases IS NOT NULL AND (NOT EXISTS(SELECT * FROM @SelectedDatabases) OR EXISTS(SELECT * FROM @SelectedDatabases WHERE DatabaseName IS NULL OR DatabaseName = ''))
925 BEGIN
926 SET @ErrorMessage = 'The value for the parameter @Databases is not supported.'
927 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
928 SET @Error = @@ERROR
929 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
930 END
931
932 ----------------------------------------------------------------------------------------------------
933 --// Select availability groups //--
934 ----------------------------------------------------------------------------------------------------
935
936 IF @AvailabilityGroups IS NOT NULL AND @Version >= 11 AND SERVERPROPERTY('IsHadrEnabled') = 1
937 BEGIN
938
939 SET @AvailabilityGroups = REPLACE(@AvailabilityGroups, CHAR(10), '')
940 SET @AvailabilityGroups = REPLACE(@AvailabilityGroups, CHAR(13), '')
941
942 WHILE CHARINDEX(', ',@AvailabilityGroups) > 0 SET @AvailabilityGroups = REPLACE(@AvailabilityGroups,', ',',')
943 WHILE CHARINDEX(' ,',@AvailabilityGroups) > 0 SET @AvailabilityGroups = REPLACE(@AvailabilityGroups,' ,',',')
944
945 SET @AvailabilityGroups = LTRIM(RTRIM(@AvailabilityGroups));
946
947 WITH AvailabilityGroups1 (StartPosition, EndPosition, AvailabilityGroupItem) AS
948 (
949 SELECT 1 AS StartPosition,
950 ISNULL(NULLIF(CHARINDEX(',', @AvailabilityGroups, 1), 0), LEN(@AvailabilityGroups) + 1) AS EndPosition,
951 SUBSTRING(@AvailabilityGroups, 1, ISNULL(NULLIF(CHARINDEX(',', @AvailabilityGroups, 1), 0), LEN(@AvailabilityGroups) + 1) - 1) AS AvailabilityGroupItem
952 WHERE @AvailabilityGroups IS NOT NULL
953 UNION ALL
954 SELECT CAST(EndPosition AS int) + 1 AS StartPosition,
955 ISNULL(NULLIF(CHARINDEX(',', @AvailabilityGroups, EndPosition + 1), 0), LEN(@AvailabilityGroups) + 1) AS EndPosition,
956 SUBSTRING(@AvailabilityGroups, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(',', @AvailabilityGroups, EndPosition + 1), 0), LEN(@AvailabilityGroups) + 1) - EndPosition - 1) AS AvailabilityGroupItem
957 FROM AvailabilityGroups1
958 WHERE EndPosition < LEN(@AvailabilityGroups) + 1
959 ),
960 AvailabilityGroups2 (AvailabilityGroupItem, StartPosition, Selected) AS
961 (
962 SELECT CASE WHEN AvailabilityGroupItem LIKE '-%' THEN RIGHT(AvailabilityGroupItem,LEN(AvailabilityGroupItem) - 1) ELSE AvailabilityGroupItem END AS AvailabilityGroupItem,
963 StartPosition,
964 CASE WHEN AvailabilityGroupItem LIKE '-%' THEN 0 ELSE 1 END AS Selected
965 FROM AvailabilityGroups1
966 ),
967 AvailabilityGroups3 (AvailabilityGroupItem, StartPosition, Selected) AS
968 (
969 SELECT CASE WHEN AvailabilityGroupItem = 'ALL_AVAILABILITY_GROUPS' THEN '%' ELSE AvailabilityGroupItem END AS AvailabilityGroupItem,
970 StartPosition,
971 Selected
972 FROM AvailabilityGroups2
973 ),
974 AvailabilityGroups4 (AvailabilityGroupName, StartPosition, Selected) AS
975 (
976 SELECT CASE WHEN LEFT(AvailabilityGroupItem,1) = '[' AND RIGHT(AvailabilityGroupItem,1) = ']' THEN PARSENAME(AvailabilityGroupItem,1) ELSE AvailabilityGroupItem END AS AvailabilityGroupItem,
977 StartPosition,
978 Selected
979 FROM AvailabilityGroups3
980 )
981 INSERT INTO @SelectedAvailabilityGroups (AvailabilityGroupName, StartPosition, Selected)
982 SELECT AvailabilityGroupName, StartPosition, Selected
983 FROM AvailabilityGroups4
984 OPTION (MAXRECURSION 0)
985
986 UPDATE tmpAvailabilityGroups
987 SET tmpAvailabilityGroups.Selected = SelectedAvailabilityGroups.Selected
988 FROM @tmpAvailabilityGroups tmpAvailabilityGroups
989 INNER JOIN @SelectedAvailabilityGroups SelectedAvailabilityGroups
990 ON tmpAvailabilityGroups.AvailabilityGroupName LIKE REPLACE(SelectedAvailabilityGroups.AvailabilityGroupName,'_','[_]')
991 WHERE SelectedAvailabilityGroups.Selected = 1
992
993 UPDATE tmpAvailabilityGroups
994 SET tmpAvailabilityGroups.Selected = SelectedAvailabilityGroups.Selected
995 FROM @tmpAvailabilityGroups tmpAvailabilityGroups
996 INNER JOIN @SelectedAvailabilityGroups SelectedAvailabilityGroups
997 ON tmpAvailabilityGroups.AvailabilityGroupName LIKE REPLACE(SelectedAvailabilityGroups.AvailabilityGroupName,'_','[_]')
998 WHERE SelectedAvailabilityGroups.Selected = 0
999
1000 UPDATE tmpAvailabilityGroups
1001 SET tmpAvailabilityGroups.StartPosition = SelectedAvailabilityGroups2.StartPosition
1002 FROM @tmpAvailabilityGroups tmpAvailabilityGroups
1003 INNER JOIN (SELECT tmpAvailabilityGroups.AvailabilityGroupName, MIN(SelectedAvailabilityGroups.StartPosition) AS StartPosition
1004 FROM @tmpAvailabilityGroups tmpAvailabilityGroups
1005 INNER JOIN @SelectedAvailabilityGroups SelectedAvailabilityGroups
1006 ON tmpAvailabilityGroups.AvailabilityGroupName LIKE REPLACE(SelectedAvailabilityGroups.AvailabilityGroupName,'_','[_]')
1007 WHERE SelectedAvailabilityGroups.Selected = 1
1008 GROUP BY tmpAvailabilityGroups.AvailabilityGroupName) SelectedAvailabilityGroups2
1009 ON tmpAvailabilityGroups.AvailabilityGroupName = SelectedAvailabilityGroups2.AvailabilityGroupName
1010
1011 UPDATE tmpDatabases
1012 SET tmpDatabases.StartPosition = tmpAvailabilityGroups.StartPosition,
1013 tmpDatabases.Selected = 1
1014 FROM @tmpDatabases tmpDatabases
1015 INNER JOIN @tmpDatabasesAvailabilityGroups tmpDatabasesAvailabilityGroups ON tmpDatabases.DatabaseName = tmpDatabasesAvailabilityGroups.DatabaseName
1016 INNER JOIN @tmpAvailabilityGroups tmpAvailabilityGroups ON tmpDatabasesAvailabilityGroups.AvailabilityGroupName = tmpAvailabilityGroups.AvailabilityGroupName
1017 WHERE tmpAvailabilityGroups.Selected = 1
1018
1019 END
1020
1021 IF @AvailabilityGroups IS NOT NULL AND (NOT EXISTS(SELECT * FROM @SelectedAvailabilityGroups) OR EXISTS(SELECT * FROM @SelectedAvailabilityGroups WHERE AvailabilityGroupName IS NULL OR AvailabilityGroupName = '') OR @Version < 11 OR SERVERPROPERTY('IsHadrEnabled') = 0)
1022 BEGIN
1023 SET @ErrorMessage = 'The value for the parameter @AvailabilityGroups is not supported.'
1024 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1025 SET @Error = @@ERROR
1026 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1027 END
1028
1029 IF (@Databases IS NULL AND @AvailabilityGroups IS NULL)
1030 BEGIN
1031 SET @ErrorMessage = 'You need to specify one of the parameters @Databases and @AvailabilityGroups.'
1032 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1033 SET @Error = @@ERROR
1034 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1035 END
1036
1037 IF (@Databases IS NOT NULL AND @AvailabilityGroups IS NOT NULL)
1038 BEGIN
1039 SET @ErrorMessage = 'You can only specify one of the parameters @Databases and @AvailabilityGroups.'
1040 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1041 SET @Error = @@ERROR
1042 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1043 END
1044
1045 ----------------------------------------------------------------------------------------------------
1046 --// Check database names //--
1047 ----------------------------------------------------------------------------------------------------
1048
1049 SET @ErrorMessage = ''
1050 SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + ', '
1051 FROM @tmpDatabases
1052 WHERE Selected = 1
1053 AND DatabaseNameFS = ''
1054 ORDER BY DatabaseName ASC
1055 IF @@ROWCOUNT > 0
1056 BEGIN
1057 SET @ErrorMessage = 'The names of the following databases are not supported: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.'
1058 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1059 SET @Error = @@ERROR
1060 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1061 END
1062
1063 SET @ErrorMessage = ''
1064 SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + ', '
1065 FROM @tmpDatabases
1066 WHERE UPPER(DatabaseNameFS) IN(SELECT UPPER(DatabaseNameFS) FROM @tmpDatabases GROUP BY UPPER(DatabaseNameFS) HAVING COUNT(*) > 1)
1067 AND UPPER(DatabaseNameFS) IN(SELECT UPPER(DatabaseNameFS) FROM @tmpDatabases WHERE Selected = 1)
1068 AND DatabaseNameFS <> ''
1069 ORDER BY DatabaseName ASC
1070 OPTION (RECOMPILE)
1071 IF @@ROWCOUNT > 0
1072 BEGIN
1073 SET @ErrorMessage = 'The names of the following databases are not unique in the file system: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.'
1074 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1075 SET @Error = @@ERROR
1076 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1077 END
1078
1079 ----------------------------------------------------------------------------------------------------
1080 --// Select directories //--
1081 ----------------------------------------------------------------------------------------------------
1082
1083 IF @Directory IS NULL AND @URL IS NULL AND @HostPlatform = 'Windows' AND (@BackupSoftware <> 'DATA_DOMAIN_BOOST' OR @BackupSoftware IS NULL)
1084 BEGIN
1085 EXECUTE [master].dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'SOFTWARE\Microsoft\MSSQLServer\MSSQLServer', N'BackupDirectory', @DefaultDirectory OUTPUT
1086
1087 IF @DefaultDirectory LIKE 'http://%' OR @DefaultDirectory LIKE 'https://%'
1088 BEGIN
1089 SET @URL = @DefaultDirectory
1090 END
1091 ELSE
1092 BEGIN
1093 INSERT INTO @Directories (ID, DirectoryPath, Mirror, Completed)
1094 SELECT 1, @DefaultDirectory, 0, 0
1095 END
1096 END
1097 IF @Directory IS NULL AND @URL IS NULL AND @HostPlatform = 'Linux'
1098 BEGIN
1099 INSERT INTO @Directories (ID, DirectoryPath, Mirror, Completed)
1100 SELECT 1, '.', 0, 0
1101 END
1102 ELSE
1103 BEGIN
1104 SET @Directory = REPLACE(@Directory, CHAR(10), '')
1105 SET @Directory = REPLACE(@Directory, CHAR(13), '')
1106
1107 WHILE CHARINDEX(', ',@Directory) > 0 SET @Directory = REPLACE(@Directory,', ',',')
1108 WHILE CHARINDEX(' ,',@Directory) > 0 SET @Directory = REPLACE(@Directory,' ,',',')
1109
1110 SET @Directory = LTRIM(RTRIM(@Directory));
1111
1112 WITH Directories (StartPosition, EndPosition, Directory) AS
1113 (
1114 SELECT 1 AS StartPosition,
1115 ISNULL(NULLIF(CHARINDEX(',', @Directory, 1), 0), LEN(@Directory) + 1) AS EndPosition,
1116 SUBSTRING(@Directory, 1, ISNULL(NULLIF(CHARINDEX(',', @Directory, 1), 0), LEN(@Directory) + 1) - 1) AS Directory
1117 WHERE @Directory IS NOT NULL
1118 UNION ALL
1119 SELECT CAST(EndPosition AS int) + 1 AS StartPosition,
1120 ISNULL(NULLIF(CHARINDEX(',', @Directory, EndPosition + 1), 0), LEN(@Directory) + 1) AS EndPosition,
1121 SUBSTRING(@Directory, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(',', @Directory, EndPosition + 1), 0), LEN(@Directory) + 1) - EndPosition - 1) AS Directory
1122 FROM Directories
1123 WHERE EndPosition < LEN(@Directory) + 1
1124 )
1125 INSERT INTO @Directories (ID, DirectoryPath, Mirror, Completed)
1126 SELECT ROW_NUMBER() OVER(ORDER BY StartPosition ASC) AS ID,
1127 Directory,
1128 0,
1129 0
1130 FROM Directories
1131 OPTION (MAXRECURSION 0)
1132 END
1133
1134 SET @MirrorDirectory = REPLACE(@MirrorDirectory, CHAR(10), '')
1135 SET @MirrorDirectory = REPLACE(@MirrorDirectory, CHAR(13), '')
1136
1137 WHILE CHARINDEX(', ',@MirrorDirectory) > 0 SET @MirrorDirectory = REPLACE(@MirrorDirectory,', ',',')
1138 WHILE CHARINDEX(' ,',@MirrorDirectory) > 0 SET @MirrorDirectory = REPLACE(@MirrorDirectory,' ,',',')
1139
1140 SET @MirrorDirectory = LTRIM(RTRIM(@MirrorDirectory));
1141
1142 WITH Directories (StartPosition, EndPosition, Directory) AS
1143 (
1144 SELECT 1 AS StartPosition,
1145 ISNULL(NULLIF(CHARINDEX(',', @MirrorDirectory, 1), 0), LEN(@MirrorDirectory) + 1) AS EndPosition,
1146 SUBSTRING(@MirrorDirectory, 1, ISNULL(NULLIF(CHARINDEX(',', @MirrorDirectory, 1), 0), LEN(@MirrorDirectory) + 1) - 1) AS Directory
1147 WHERE @MirrorDirectory IS NOT NULL
1148 UNION ALL
1149 SELECT CAST(EndPosition AS int) + 1 AS StartPosition,
1150 ISNULL(NULLIF(CHARINDEX(',', @MirrorDirectory, EndPosition + 1), 0), LEN(@MirrorDirectory) + 1) AS EndPosition,
1151 SUBSTRING(@MirrorDirectory, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(',', @MirrorDirectory, EndPosition + 1), 0), LEN(@MirrorDirectory) + 1) - EndPosition - 1) AS Directory
1152 FROM Directories
1153 WHERE EndPosition < LEN(@MirrorDirectory) + 1
1154 )
1155 INSERT INTO @Directories (ID, DirectoryPath, Mirror, Completed)
1156 SELECT (SELECT COUNT(*) FROM @Directories) + ROW_NUMBER() OVER(ORDER BY StartPosition ASC) AS ID,
1157 Directory,
1158 1,
1159 0
1160 FROM Directories
1161 OPTION (MAXRECURSION 0)
1162
1163 ----------------------------------------------------------------------------------------------------
1164 --// Check directories //--
1165 ----------------------------------------------------------------------------------------------------
1166
1167 SET @DirectoryCheck = 1
1168
1169 IF EXISTS(SELECT * FROM @Directories WHERE Mirror = 0 AND (NOT (DirectoryPath LIKE '_:' OR DirectoryPath LIKE '_:\%' OR DirectoryPath LIKE '\\%\%' OR (DirectoryPath LIKE '/%/%' AND @HostPlatform = 'Linux') OR (DirectoryPath LIKE '.' AND @HostPlatform = 'Linux')) OR DirectoryPath IS NULL OR LEFT(DirectoryPath,1) = ' ' OR RIGHT(DirectoryPath,1) = ' ')) OR EXISTS (SELECT * FROM @Directories GROUP BY DirectoryPath HAVING COUNT(*) <> 1) OR ((SELECT COUNT(*) FROM @Directories WHERE Mirror = 0) <> (SELECT COUNT(*) FROM @Directories WHERE Mirror = 1) AND (SELECT COUNT(*) FROM @Directories WHERE Mirror = 1) > 0) OR (@Directory IS NOT NULL AND SERVERPROPERTY('EngineEdition') = 8) OR (@Directory IS NOT NULL AND @BackupSoftware = 'DATA_DOMAIN_BOOST')
1170 BEGIN
1171 SET @ErrorMessage = 'The value for the parameter @Directory is not supported.'
1172 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1173 SET @Error = @@ERROR
1174 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1175 SET @DirectoryCheck = 0
1176 END
1177
1178 IF EXISTS(SELECT * FROM @Directories WHERE Mirror = 1 AND (NOT (DirectoryPath LIKE '_:' OR DirectoryPath LIKE '_:\%' OR DirectoryPath LIKE '\\%\%' OR (DirectoryPath LIKE '/%/%' AND @HostPlatform = 'Linux') OR (DirectoryPath LIKE '.' AND @HostPlatform = 'Linux')) OR DirectoryPath IS NULL OR LEFT(DirectoryPath,1) = ' ' OR RIGHT(DirectoryPath,1) = ' ')) OR EXISTS (SELECT * FROM @Directories GROUP BY DirectoryPath HAVING COUNT(*) <> 1) OR ((SELECT COUNT(*) FROM @Directories WHERE Mirror = 0) <> (SELECT COUNT(*) FROM @Directories WHERE Mirror = 1) AND (SELECT COUNT(*) FROM @Directories WHERE Mirror = 1) > 0) OR (@BackupSoftware IN('SQLBACKUP','SQLSAFE') AND (SELECT COUNT(*) FROM @Directories WHERE Mirror = 1) > 1) OR (@BackupSoftware IS NULL AND EXISTS(SELECT * FROM @Directories WHERE Mirror = 1) AND SERVERPROPERTY('EngineEdition') <> 3) OR (@MirrorDirectory IS NOT NULL AND SERVERPROPERTY('EngineEdition') = 8) OR (@MirrorDirectory IS NOT NULL AND @BackupSoftware = 'DATA_DOMAIN_BOOST')
1179 BEGIN
1180 SET @ErrorMessage = 'The value for the parameter @MirrorDirectory is not supported.'
1181 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1182 SET @Error = @@ERROR
1183 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1184 SET @DirectoryCheck = 0
1185 END
1186
1187 IF (@BackupSoftware IS NULL AND EXISTS(SELECT * FROM @Directories WHERE Mirror = 1) AND SERVERPROPERTY('EngineEdition') <> 3)
1188 BEGIN
1189 SET @ErrorMessage = 'Mirrored backup to disk is only available in Enterprise and Developer Edition.'
1190 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1191 SET @Error = @@ERROR
1192 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1193 END
1194
1195 IF @DirectoryCheck = 1
1196 BEGIN
1197 WHILE (1 = 1)
1198 BEGIN
1199 SELECT TOP 1 @CurrentRootDirectoryID = ID,
1200 @CurrentRootDirectoryPath = DirectoryPath
1201 FROM @Directories
1202 WHERE Completed = 0
1203 ORDER BY ID ASC
1204
1205 IF @@ROWCOUNT = 0
1206 BEGIN
1207 BREAK
1208 END
1209
1210 INSERT INTO @DirectoryInfo (FileExists, FileIsADirectory, ParentDirectoryExists)
1211 EXECUTE [master].dbo.xp_fileexist @CurrentRootDirectoryPath
1212
1213 IF NOT EXISTS (SELECT * FROM @DirectoryInfo WHERE FileExists = 0 AND FileIsADirectory = 1 AND ParentDirectoryExists = 1)
1214 BEGIN
1215 SET @ErrorMessage = 'The directory ' + @CurrentRootDirectoryPath + ' does not exist.'
1216 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1217 SET @Error = @@ERROR
1218 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1219 END
1220
1221 UPDATE @Directories
1222 SET Completed = 1
1223 WHERE ID = @CurrentRootDirectoryID
1224
1225 SET @CurrentRootDirectoryID = NULL
1226 SET @CurrentRootDirectoryPath = NULL
1227
1228 DELETE FROM @DirectoryInfo
1229 END
1230 END
1231
1232 ----------------------------------------------------------------------------------------------------
1233 --// Select URLs //--
1234 ----------------------------------------------------------------------------------------------------
1235
1236 SET @URL = REPLACE(@URL, CHAR(10), '')
1237 SET @URL = REPLACE(@URL, CHAR(13), '')
1238
1239 WHILE CHARINDEX(', ',@URL) > 0 SET @URL = REPLACE(@URL,', ',',')
1240 WHILE CHARINDEX(' ,',@URL) > 0 SET @URL = REPLACE(@URL,' ,',',')
1241
1242 SET @URL = LTRIM(RTRIM(@URL));
1243
1244 WITH URLs (StartPosition, EndPosition, [URL]) AS
1245 (
1246 SELECT 1 AS StartPosition,
1247 ISNULL(NULLIF(CHARINDEX(',', @URL, 1), 0), LEN(@URL) + 1) AS EndPosition,
1248 SUBSTRING(@URL, 1, ISNULL(NULLIF(CHARINDEX(',', @URL, 1), 0), LEN(@URL) + 1) - 1) AS [URL]
1249 WHERE @URL IS NOT NULL
1250 UNION ALL
1251 SELECT CAST(EndPosition AS int) + 1 AS StartPosition,
1252 ISNULL(NULLIF(CHARINDEX(',', @URL, EndPosition + 1), 0), LEN(@URL) + 1) AS EndPosition,
1253 SUBSTRING(@URL, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(',', @URL, EndPosition + 1), 0), LEN(@URL) + 1) - EndPosition - 1) AS [URL]
1254 FROM URLs
1255 WHERE EndPosition < LEN(@URL) + 1
1256 )
1257 INSERT INTO @URLs (ID, DirectoryPath, Mirror)
1258 SELECT ROW_NUMBER() OVER(ORDER BY StartPosition ASC) AS ID,
1259 [URL],
1260 0
1261 FROM URLs
1262 OPTION (MAXRECURSION 0)
1263
1264 SET @MirrorURL = REPLACE(@MirrorURL, CHAR(10), '')
1265 SET @MirrorURL = REPLACE(@MirrorURL, CHAR(13), '')
1266
1267 WHILE CHARINDEX(', ',@MirrorURL) > 0 SET @MirrorURL = REPLACE(@MirrorURL,', ',',')
1268 WHILE CHARINDEX(' ,',@MirrorURL) > 0 SET @MirrorURL = REPLACE(@MirrorURL,' ,',',')
1269
1270 SET @MirrorURL = LTRIM(RTRIM(@MirrorURL));
1271
1272 WITH URLs (StartPosition, EndPosition, [URL]) AS
1273 (
1274 SELECT 1 AS StartPosition,
1275 ISNULL(NULLIF(CHARINDEX(',', @MirrorURL, 1), 0), LEN(@MirrorURL) + 1) AS EndPosition,
1276 SUBSTRING(@MirrorURL, 1, ISNULL(NULLIF(CHARINDEX(',', @MirrorURL, 1), 0), LEN(@MirrorURL) + 1) - 1) AS [URL]
1277 WHERE @MirrorURL IS NOT NULL
1278 UNION ALL
1279 SELECT CAST(EndPosition AS int) + 1 AS StartPosition,
1280 ISNULL(NULLIF(CHARINDEX(',', @MirrorURL, EndPosition + 1), 0), LEN(@MirrorURL) + 1) AS EndPosition,
1281 SUBSTRING(@MirrorURL, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(',', @MirrorURL, EndPosition + 1), 0), LEN(@MirrorURL) + 1) - EndPosition - 1) AS [URL]
1282 FROM URLs
1283 WHERE EndPosition < LEN(@MirrorURL) + 1
1284 )
1285 INSERT INTO @URLs (ID, DirectoryPath, Mirror)
1286 SELECT (SELECT COUNT(*) FROM @URLs) + ROW_NUMBER() OVER(ORDER BY StartPosition ASC) AS ID,
1287 [URL],
1288 1
1289 FROM URLs
1290 OPTION (MAXRECURSION 0)
1291
1292 ----------------------------------------------------------------------------------------------------
1293 --// Check URLs //--
1294 ----------------------------------------------------------------------------------------------------
1295
1296 IF EXISTS(SELECT * FROM @URLs WHERE Mirror = 0 AND DirectoryPath NOT LIKE 'https://%/%')
1297 OR EXISTS (SELECT * FROM @URLs GROUP BY DirectoryPath HAVING COUNT(*) <> 1)
1298 OR ((SELECT COUNT(*) FROM @URLs WHERE Mirror = 0) <> (SELECT COUNT(*) FROM @URLs WHERE Mirror = 1) AND (SELECT COUNT(*) FROM @URLs WHERE Mirror = 1) > 0)
1299 BEGIN
1300 SET @ErrorMessage = 'The value for the parameter @URL is not supported.'
1301 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1302 SET @Error = @@ERROR
1303 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1304 END
1305
1306 IF EXISTS(SELECT * FROM @URLs WHERE Mirror = 1 AND DirectoryPath NOT LIKE 'https://%/%')
1307 OR EXISTS (SELECT * FROM @URLs GROUP BY DirectoryPath HAVING COUNT(*) <> 1)
1308 OR ((SELECT COUNT(*) FROM @URLs WHERE Mirror = 0) <> (SELECT COUNT(*) FROM @URLs WHERE Mirror = 1) AND (SELECT COUNT(*) FROM @URLs WHERE Mirror = 1) > 0)
1309 BEGIN
1310 SET @ErrorMessage = 'The value for the parameter @MirrorURL is not supported.'
1311 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1312 SET @Error = @@ERROR
1313 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1314 END
1315
1316 ----------------------------------------------------------------------------------------------------
1317 --// Get directory separator //--
1318 ----------------------------------------------------------------------------------------------------
1319
1320 SELECT @DirectorySeparator = CASE
1321 WHEN @URL IS NOT NULL THEN '/'
1322 WHEN @HostPlatform = 'Windows' THEN '\'
1323 WHEN @HostPlatform = 'Linux' THEN '/'
1324 END
1325
1326 UPDATE @Directories
1327 SET DirectoryPath = LEFT(DirectoryPath,LEN(DirectoryPath) - 1)
1328 WHERE RIGHT(DirectoryPath,1) = @DirectorySeparator
1329
1330 UPDATE @URLs
1331 SET DirectoryPath = LEFT(DirectoryPath,LEN(DirectoryPath) - 1)
1332 WHERE RIGHT(DirectoryPath,1) = @DirectorySeparator
1333
1334 ----------------------------------------------------------------------------------------------------
1335 --// Get file extension //--
1336 ----------------------------------------------------------------------------------------------------
1337
1338 IF @FileExtensionFull IS NULL
1339 BEGIN
1340 SELECT @FileExtensionFull = CASE
1341 WHEN @BackupSoftware IS NULL THEN 'bak'
1342 WHEN @BackupSoftware = 'LITESPEED' THEN 'bak'
1343 WHEN @BackupSoftware = 'SQLBACKUP' THEN 'sqb'
1344 WHEN @BackupSoftware = 'SQLSAFE' THEN 'safe'
1345 END
1346 END
1347
1348 IF @FileExtensionDiff IS NULL
1349 BEGIN
1350 SELECT @FileExtensionDiff = CASE
1351 WHEN @BackupSoftware IS NULL THEN 'bak'
1352 WHEN @BackupSoftware = 'LITESPEED' THEN 'bak'
1353 WHEN @BackupSoftware = 'SQLBACKUP' THEN 'sqb'
1354 WHEN @BackupSoftware = 'SQLSAFE' THEN 'safe'
1355 END
1356 END
1357
1358 IF @FileExtensionLog IS NULL
1359 BEGIN
1360 SELECT @FileExtensionLog = CASE
1361 WHEN @BackupSoftware IS NULL THEN 'trn'
1362 WHEN @BackupSoftware = 'LITESPEED' THEN 'trn'
1363 WHEN @BackupSoftware = 'SQLBACKUP' THEN 'sqb'
1364 WHEN @BackupSoftware = 'SQLSAFE' THEN 'safe'
1365 END
1366 END
1367
1368 ----------------------------------------------------------------------------------------------------
1369 --// Get default compression //--
1370 ----------------------------------------------------------------------------------------------------
1371
1372 IF @Compress IS NULL
1373 BEGIN
1374 SELECT @Compress = CASE
1375 WHEN @BackupSoftware IS NULL AND EXISTS(SELECT * FROM sys.configurations WHERE name = 'backup compression default' AND value_in_use = 1) THEN 'Y'
1376 WHEN @BackupSoftware IS NULL AND NOT EXISTS(SELECT * FROM sys.configurations WHERE name = 'backup compression default' AND value_in_use = 1) THEN 'N'
1377 WHEN @BackupSoftware IS NOT NULL AND (@CompressionLevel IS NULL OR @CompressionLevel > 0) THEN 'Y'
1378 WHEN @BackupSoftware IS NOT NULL AND @CompressionLevel = 0 THEN 'N'
1379 END
1380 END
1381
1382 ----------------------------------------------------------------------------------------------------
1383 --// Get number of files //--
1384 ----------------------------------------------------------------------------------------------------
1385
1386 IF @NumberOfFiles IS NULL
1387 BEGIN
1388 SELECT @NumberOfFiles = CASE
1389 WHEN @BackupSoftware = 'DATA_DOMAIN_BOOST' THEN 1
1390 WHEN @URL IS NOT NULL THEN (SELECT COUNT(*) FROM @URLs WHERE Mirror = 0)
1391 ELSE (SELECT COUNT(*) FROM @Directories WHERE Mirror = 0)
1392 END
1393 END
1394
1395 ----------------------------------------------------------------------------------------------------
1396 --// Check input parameters //--
1397 ----------------------------------------------------------------------------------------------------
1398
1399 IF @BackupType NOT IN ('FULL','DIFF','LOG') OR @BackupType IS NULL
1400 BEGIN
1401 SET @ErrorMessage = 'The value for the parameter @BackupType is not supported.'
1402 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1403 SET @Error = @@ERROR
1404 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1405 END
1406
1407 IF SERVERPROPERTY('EngineEdition') = 8 AND NOT (@BackupType = 'FULL' AND @CopyOnly = 'Y')
1408 BEGIN
1409 SET @ErrorMessage = 'SQL Database Managed Instance only supports COPY_ONLY full backups.'
1410 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1411 SET @Error = @@ERROR
1412 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1413 END
1414
1415 IF @Verify NOT IN ('Y','N') OR @Verify IS NULL OR (@BackupSoftware = 'SQLSAFE' AND @Encrypt = 'Y' AND @Verify = 'Y') OR (@Verify = 'Y' AND @BackupSoftware = 'DATA_DOMAIN_BOOST')
1416 BEGIN
1417 SET @ErrorMessage = 'The value for the parameter @Verify is not supported.'
1418 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1419 SET @Error = @@ERROR
1420 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1421 END
1422
1423 IF @CleanupTime < 0
1424 BEGIN
1425 SET @ErrorMessage = 'The value for the parameter @CleanupTime is not supported.'
1426 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1427 SET @Error = @@ERROR
1428 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1429 END
1430
1431 IF @CleanupTime IS NOT NULL AND @URL IS NOT NULL
1432 BEGIN
1433 SET @ErrorMessage = 'The value for the parameter @CleanupTime is not supported. Cleanup is not supported on Azure Blob Storage.'
1434 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1435 SET @Error = @@ERROR
1436 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1437 END
1438
1439 IF @CleanupTime IS NOT NULL AND @HostPlatform = 'Linux'
1440 BEGIN
1441 SET @ErrorMessage = 'The value for the parameter @CleanupTime is not supported. Cleanup is not supported on Linux.'
1442 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1443 SET @Error = @@ERROR
1444 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1445 END
1446
1447 IF @CleanupTime IS NOT NULL AND ((@DirectoryStructure NOT LIKE '%{DatabaseName}%' OR @DirectoryStructure IS NULL) OR (SERVERPROPERTY('IsHadrEnabled') = 1 AND (@AvailabilityGroupDirectoryStructure NOT LIKE '%{DatabaseName}%' OR @AvailabilityGroupDirectoryStructure IS NULL)))
1448 BEGIN
1449 SET @ErrorMessage = 'The value for the parameter @CleanupTime is not supported. Cleanup is not supported if the token {DatabaseName} is not part of the directory.'
1450 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1451 SET @Error = @@ERROR
1452 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1453 END
1454
1455 IF @CleanupTime IS NOT NULL AND ((@DirectoryStructure NOT LIKE '%{BackupType}%' OR @DirectoryStructure IS NULL) OR (SERVERPROPERTY('IsHadrEnabled') = 1 AND (@AvailabilityGroupDirectoryStructure NOT LIKE '%{BackupType}%' OR @AvailabilityGroupDirectoryStructure IS NULL)))
1456 BEGIN
1457 SET @ErrorMessage = 'The value for the parameter @CleanupTime is not supported. Cleanup is not supported if the token {BackupType} is not part of the directory.'
1458 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1459 SET @Error = @@ERROR
1460 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1461 END
1462
1463 IF @CleanupTime IS NOT NULL AND @CopyOnly = 'Y' AND ((@DirectoryStructure NOT LIKE '%{CopyOnly}%' OR @DirectoryStructure IS NULL) OR (SERVERPROPERTY('IsHadrEnabled') = 1 AND (@AvailabilityGroupDirectoryStructure NOT LIKE '%{CopyOnly}%' OR @AvailabilityGroupDirectoryStructure IS NULL)))
1464 BEGIN
1465 SET @ErrorMessage = 'The value for the parameter @CleanupTime is not supported. Cleanup is not supported if the token {CopyOnly} is not part of the directory.'
1466 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1467 SET @Error = @@ERROR
1468 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1469 END
1470
1471 IF @CleanupMode NOT IN('BEFORE_BACKUP','AFTER_BACKUP') OR @CleanupMode IS NULL
1472 BEGIN
1473 SET @ErrorMessage = 'The value for the parameter @CleanupMode is not supported.'
1474 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1475 SET @Error = @@ERROR
1476 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1477 END
1478
1479 IF @Compress NOT IN ('Y','N') OR @Compress IS NULL OR (@Compress = 'Y' AND @BackupSoftware IS NULL AND NOT ((@Version >= 10 AND @Version < 10.5 AND SERVERPROPERTY('EngineEdition') = 3) OR (@Version >= 10.5 AND (SERVERPROPERTY('EngineEdition') IN (3, 8) OR SERVERPROPERTY('EditionID') IN (-1534726760, 284895786))))) OR (@Compress = 'N' AND @BackupSoftware IN ('LITESPEED','SQLBACKUP','SQLSAFE') AND (@CompressionLevel IS NULL OR @CompressionLevel >= 1)) OR (@Compress = 'Y' AND @BackupSoftware IN ('LITESPEED','SQLBACKUP','SQLSAFE') AND @CompressionLevel = 0)
1480 BEGIN
1481 SET @ErrorMessage = 'The value for the parameter @Compress is not supported.'
1482 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1483 SET @Error = @@ERROR
1484 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1485 END
1486
1487 IF @CopyOnly NOT IN ('Y','N') OR @CopyOnly IS NULL
1488 BEGIN
1489 SET @ErrorMessage = 'The value for the parameter @CopyOnly is not supported.'
1490 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1491 SET @Error = @@ERROR
1492 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1493 END
1494
1495 IF @ChangeBackupType NOT IN ('Y','N') OR @ChangeBackupType IS NULL
1496 BEGIN
1497 SET @ErrorMessage = 'The value for the parameter @ChangeBackupType is not supported.'
1498 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1499 SET @Error = @@ERROR
1500 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1501 END
1502
1503 IF @BackupSoftware NOT IN ('LITESPEED','SQLBACKUP','SQLSAFE','DATA_DOMAIN_BOOST') OR (@BackupSoftware IS NOT NULL AND @HostPlatform = 'Linux')
1504 BEGIN
1505 SET @ErrorMessage = 'The value for the parameter @BackupSoftware is not supported.'
1506 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1507 SET @Error = @@ERROR
1508 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1509 END
1510
1511 IF @BackupSoftware = 'LITESPEED' AND NOT EXISTS (SELECT * FROM [master].sys.objects WHERE [type] = 'X' AND [name] = 'xp_backup_database')
1512 BEGIN
1513 SET @ErrorMessage = 'LiteSpeed for SQL Server is not installed. Download https://www.quest.com/products/litespeed-for-sql-server/.'
1514 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1515 SET @Error = @@ERROR
1516 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1517 END
1518
1519 IF @BackupSoftware = 'SQLBACKUP' AND NOT EXISTS (SELECT * FROM [master].sys.objects WHERE [type] = 'X' AND [name] = 'sqlbackup')
1520 BEGIN
1521 SET @ErrorMessage = 'Red Gate SQL Backup Pro is not installed. Download https://www.red-gate.com/products/dba/sql-backup/.'
1522 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1523 SET @Error = @@ERROR
1524 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1525 END
1526
1527 IF @BackupSoftware = 'SQLSAFE' AND NOT EXISTS (SELECT * FROM [master].sys.objects WHERE [type] = 'X' AND [name] = 'xp_ss_backup')
1528 BEGIN
1529 SET @ErrorMessage = 'Idera SQL Safe Backup is not installed. Download https://www.idera.com/productssolutions/sqlserver/sqlsafebackup.'
1530 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1531 SET @Error = @@ERROR
1532 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1533 END
1534
1535 IF @BackupSoftware = 'DATA_DOMAIN_BOOST' AND NOT EXISTS (SELECT * FROM [master].sys.objects WHERE [type] = 'PC' AND [name] = 'emc_run_backup')
1536 BEGIN
1537 SET @ErrorMessage = 'EMC Data Domain Boost is not installed. Download https://www.emc.com/en-us/data-protection/data-domain.htm.'
1538 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1539 SET @Error = @@ERROR
1540 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1541 END
1542
1543 IF @CheckSum NOT IN ('Y','N') OR @CheckSum IS NULL
1544 BEGIN
1545 SET @ErrorMessage = 'The value for the parameter @CheckSum is not supported.'
1546 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1547 SET @Error = @@ERROR
1548 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1549 END
1550
1551 IF @BlockSize NOT IN (512,1024,2048,4096,8192,16384,32768,65536) OR (@BlockSize IS NOT NULL AND @BackupSoftware = 'SQLBACKUP') OR (@BlockSize IS NOT NULL AND @BackupSoftware = 'SQLSAFE') OR (@BlockSize IS NOT NULL AND @URL IS NOT NULL AND @Credential IS NOT NULL) OR (@BlockSize IS NOT NULL AND @BackupSoftware = 'DATA_DOMAIN_BOOST')
1552 BEGIN
1553 SET @ErrorMessage = 'The value for the parameter @BlockSize is not supported.'
1554 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1555 SET @Error = @@ERROR
1556 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1557 END
1558
1559 IF @BufferCount <= 0 OR @BufferCount > 2147483647 OR (@BufferCount IS NOT NULL AND @BackupSoftware = 'SQLBACKUP') OR (@BufferCount IS NOT NULL AND @BackupSoftware = 'SQLSAFE')
1560 BEGIN
1561 SET @ErrorMessage = 'The value for the parameter @BufferCount is not supported.'
1562 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1563 SET @Error = @@ERROR
1564 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1565 END
1566
1567 IF @MaxTransferSize < 65536 OR @MaxTransferSize > 4194304 OR (@MaxTransferSize > 1048576 AND @BackupSoftware = 'SQLBACKUP') OR (@MaxTransferSize IS NOT NULL AND @BackupSoftware = 'SQLSAFE') OR (@MaxTransferSize IS NOT NULL AND @URL IS NOT NULL AND @Credential IS NOT NULL) OR (@MaxTransferSize IS NOT NULL AND @BackupSoftware = 'DATA_DOMAIN_BOOST')
1568 BEGIN
1569 SET @ErrorMessage = 'The value for the parameter @MaxTransferSize is not supported.'
1570 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1571 SET @Error = @@ERROR
1572 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1573 END
1574
1575 IF @NumberOfFiles < 1 OR @NumberOfFiles > 64 OR (@NumberOfFiles > 32 AND @BackupSoftware = 'SQLBACKUP') OR @NumberOfFiles IS NULL OR @NumberOfFiles < (SELECT COUNT(*) FROM @Directories WHERE Mirror = 0) OR @NumberOfFiles % (SELECT NULLIF(COUNT(*),0) FROM @Directories WHERE Mirror = 0) > 0 OR (@URL IS NOT NULL AND @Credential IS NOT NULL AND @NumberOfFiles <> 1) OR (@NumberOfFiles > 1 AND @BackupSoftware IN('SQLBACKUP','SQLSAFE') AND EXISTS(SELECT * FROM @Directories WHERE Mirror = 1)) OR (@NumberOfFiles > 32 AND @BackupSoftware = 'DATA_DOMAIN_BOOST') OR @NumberOfFiles < (SELECT COUNT(*) FROM @URLs WHERE Mirror = 0) OR @NumberOfFiles % (SELECT NULLIF(COUNT(*),0) FROM @URLs WHERE Mirror = 0) > 0
1576 BEGIN
1577 SET @ErrorMessage = 'The value for the parameter @NumberOfFiles is not supported.'
1578 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1579 SET @Error = @@ERROR
1580 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1581 END
1582
1583 IF (@BackupSoftware IS NULL AND @CompressionLevel IS NOT NULL) OR (@BackupSoftware = 'LITESPEED' AND (@CompressionLevel < 0 OR @CompressionLevel > 8)) OR (@BackupSoftware = 'SQLBACKUP' AND (@CompressionLevel < 0 OR @CompressionLevel > 4)) OR (@BackupSoftware = 'SQLSAFE' AND (@CompressionLevel < 1 OR @CompressionLevel > 4)) OR (@CompressionLevel IS NOT NULL AND @BackupSoftware = 'DATA_DOMAIN_BOOST')
1584 BEGIN
1585 SET @ErrorMessage = 'The value for the parameter @CompressionLevel is not supported.'
1586 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1587 SET @Error = @@ERROR
1588 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1589 END
1590
1591 IF LEN(@Description) > 255 OR (@BackupSoftware = 'LITESPEED' AND LEN(@Description) > 128) OR (@BackupSoftware = 'DATA_DOMAIN_BOOST' AND LEN(@Description) > 254)
1592 BEGIN
1593 SET @ErrorMessage = 'The value for the parameter @Description is not supported.'
1594 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1595 SET @Error = @@ERROR
1596 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1597 END
1598
1599 IF @Threads IS NOT NULL AND (@BackupSoftware NOT IN('LITESPEED','SQLBACKUP','SQLSAFE') OR @BackupSoftware IS NULL) OR (@BackupSoftware = 'LITESPEED' AND (@Threads < 1 OR @Threads > 32)) OR (@BackupSoftware = 'SQLBACKUP' AND (@Threads < 2 OR @Threads > 32)) OR (@BackupSoftware = 'SQLSAFE' AND (@Threads < 1 OR @Threads > 64))
1600 BEGIN
1601 SET @ErrorMessage = 'The value for the parameter @Threads is not supported.'
1602 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1603 SET @Error = @@ERROR
1604 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1605 END
1606
1607 IF @Throttle IS NOT NULL AND (@BackupSoftware NOT IN('LITESPEED') OR @BackupSoftware IS NULL) OR @Throttle < 1 OR @Throttle > 100
1608 BEGIN
1609 SET @ErrorMessage = 'The value for the parameter @Throttle is not supported.'
1610 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1611 SET @Error = @@ERROR
1612 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1613 END
1614
1615 IF @Encrypt NOT IN('Y','N') OR @Encrypt IS NULL OR (@Encrypt = 'Y' AND @BackupSoftware IS NULL AND NOT (@Version >= 12 AND (SERVERPROPERTY('EngineEdition') = 3) OR SERVERPROPERTY('EditionID') IN(-1534726760, 284895786))) OR (@Encrypt = 'Y' AND @BackupSoftware = 'DATA_DOMAIN_BOOST')
1616 BEGIN
1617 SET @ErrorMessage = 'The value for the parameter @Encrypt is not supported.'
1618 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1619 SET @Error = @@ERROR
1620 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1621 END
1622
1623 IF (@BackupSoftware IS NULL AND @Encrypt = 'Y' AND (@EncryptionAlgorithm NOT IN('AES_128','AES_192','AES_256','TRIPLE_DES_3KEY') OR @EncryptionAlgorithm IS NULL)) OR (@BackupSoftware = 'LITESPEED' AND @Encrypt = 'Y' AND (@EncryptionAlgorithm NOT IN('RC2_40','RC2_56','RC2_112','RC2_128','TRIPLE_DES_3KEY','RC4_128','AES_128','AES_192','AES_256') OR @EncryptionAlgorithm IS NULL)) OR (@BackupSoftware = 'SQLBACKUP' AND @Encrypt = 'Y' AND (@EncryptionAlgorithm NOT IN('AES_128','AES_256') OR @EncryptionAlgorithm IS NULL)) OR (@BackupSoftware = 'SQLSAFE' AND @Encrypt = 'Y' AND (@EncryptionAlgorithm NOT IN('AES_128','AES_256') OR @EncryptionAlgorithm IS NULL)) OR (@EncryptionAlgorithm IS NOT NULL AND @BackupSoftware = 'DATA_DOMAIN_BOOST')
1624 BEGIN
1625 SET @ErrorMessage = 'The value for the parameter @EncryptionAlgorithm is not supported.'
1626 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1627 SET @Error = @@ERROR
1628 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1629 END
1630
1631 IF (NOT (@BackupSoftware IS NULL AND @Encrypt = 'Y') AND @ServerCertificate IS NOT NULL) OR (@BackupSoftware IS NULL AND @Encrypt = 'Y' AND @ServerCertificate IS NULL AND @ServerAsymmetricKey IS NULL) OR (@BackupSoftware IS NULL AND @Encrypt = 'Y' AND @ServerCertificate IS NOT NULL AND @ServerAsymmetricKey IS NOT NULL) OR (@ServerCertificate IS NOT NULL AND NOT EXISTS(SELECT * FROM master.sys.certificates WHERE name = @ServerCertificate))
1632 BEGIN
1633 SET @ErrorMessage = 'The value for the parameter @ServerCertificate is not supported.'
1634 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1635 SET @Error = @@ERROR
1636 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1637 END
1638
1639 IF (NOT (@BackupSoftware IS NULL AND @Encrypt = 'Y') AND @ServerAsymmetricKey IS NOT NULL) OR (@BackupSoftware IS NULL AND @Encrypt = 'Y' AND @ServerAsymmetricKey IS NULL AND @ServerCertificate IS NULL) OR (@BackupSoftware IS NULL AND @Encrypt = 'Y' AND @ServerAsymmetricKey IS NOT NULL AND @ServerCertificate IS NOT NULL) OR (@ServerAsymmetricKey IS NOT NULL AND NOT EXISTS(SELECT * FROM master.sys.asymmetric_keys WHERE name = @ServerAsymmetricKey))
1640 BEGIN
1641 SET @ErrorMessage = 'The value for the parameter @ServerAsymmetricKey is not supported.'
1642 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1643 SET @Error = @@ERROR
1644 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1645 END
1646
1647 IF (@EncryptionKey IS NOT NULL AND @BackupSoftware IS NULL) OR (@EncryptionKey IS NOT NULL AND @Encrypt = 'N') OR (@EncryptionKey IS NULL AND @Encrypt = 'Y' AND @BackupSoftware IN('LITESPEED','SQLBACKUP','SQLSAFE')) OR (@EncryptionKey IS NOT NULL AND @BackupSoftware = 'DATA_DOMAIN_BOOST')
1648 BEGIN
1649 SET @ErrorMessage = 'The value for the parameter @EncryptionKey is not supported.'
1650 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1651 SET @Error = @@ERROR
1652 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1653 END
1654
1655 IF @ReadWriteFileGroups NOT IN('Y','N') OR @ReadWriteFileGroups IS NULL OR (@ReadWriteFileGroups = 'Y' AND @BackupType = 'LOG')
1656 BEGIN
1657 SET @ErrorMessage = 'The value for the parameter @ReadWriteFileGroups is not supported.'
1658 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1659 SET @Error = @@ERROR
1660 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1661 END
1662
1663 IF @OverrideBackupPreference NOT IN('Y','N') OR @OverrideBackupPreference IS NULL
1664 BEGIN
1665 SET @ErrorMessage = 'The value for the parameter @OverrideBackupPreference is not supported.'
1666 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1667 SET @Error = @@ERROR
1668 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1669 END
1670
1671 IF @NoRecovery NOT IN('Y','N') OR @NoRecovery IS NULL OR (@NoRecovery = 'Y' AND @BackupType <> 'LOG') OR (@NoRecovery = 'Y' AND @BackupSoftware = 'SQLSAFE')
1672 BEGIN
1673 SET @ErrorMessage = 'The value for the parameter @NoRecovery is not supported.'
1674 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1675 SET @Error = @@ERROR
1676 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1677 END
1678
1679 IF (@URL IS NOT NULL AND @Directory IS NOT NULL) OR (@URL IS NOT NULL AND @MirrorDirectory IS NOT NULL) OR (@URL IS NOT NULL AND @Version < 11.03339) OR (@URL IS NOT NULL AND @BackupSoftware IS NOT NULL)
1680 BEGIN
1681 SET @ErrorMessage = 'The value for the parameter @URL is not supported.'
1682 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1683 SET @Error = @@ERROR
1684 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1685 END
1686
1687 IF (@Credential IS NULL AND @URL IS NOT NULL AND NOT (@Version >= 13 OR SERVERPROPERTY('EngineEdition') = 8)) OR (@Credential IS NOT NULL AND @URL IS NULL) OR (@URL IS NOT NULL AND @Credential IS NULL AND NOT EXISTS(SELECT * FROM sys.credentials WHERE UPPER(credential_identity) = 'SHARED ACCESS SIGNATURE')) OR (@Credential IS NOT NULL AND NOT EXISTS(SELECT * FROM sys.credentials WHERE name = @Credential))
1688 BEGIN
1689 SET @ErrorMessage = 'The value for the parameter @Credential is not supported.'
1690 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1691 SET @Error = @@ERROR
1692 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1693 END
1694
1695 IF @MirrorCleanupTime < 0 OR (@MirrorCleanupTime IS NOT NULL AND @MirrorDirectory IS NULL)
1696 BEGIN
1697 SET @ErrorMessage = 'The value for the parameter @MirrorCleanupTime is not supported.'
1698 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1699 SET @Error = @@ERROR
1700 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1701 END
1702
1703 IF @MirrorCleanupMode NOT IN('BEFORE_BACKUP','AFTER_BACKUP') OR @MirrorCleanupMode IS NULL
1704 BEGIN
1705 SET @ErrorMessage = 'The value for the parameter @MirrorCleanupMode is not supported.'
1706 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1707 SET @Error = @@ERROR
1708 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1709 END
1710
1711 IF (@MirrorURL IS NOT NULL AND @Directory IS NOT NULL) OR (@MirrorURL IS NOT NULL AND @MirrorDirectory IS NOT NULL) OR (@MirrorURL IS NOT NULL AND @Version < 11.03339) OR (@MirrorURL IS NOT NULL AND @BackupSoftware IS NOT NULL) OR (@MirrorURL IS NOT NULL AND @URL IS NULL)
1712 BEGIN
1713 SET @ErrorMessage = 'The value for the parameter @MirrorURL is not supported.'
1714 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1715 SET @Error = @@ERROR
1716 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1717 END
1718
1719 IF @Updateability NOT IN('READ_ONLY','READ_WRITE','ALL') OR @Updateability IS NULL
1720 BEGIN
1721 SET @ErrorMessage = 'The value for the parameter @Updateability is not supported.'
1722 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1723 SET @Error = @@ERROR
1724 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1725 END
1726
1727 IF @AdaptiveCompression NOT IN('SIZE','SPEED') OR (@AdaptiveCompression IS NOT NULL AND (@BackupSoftware NOT IN('LITESPEED') OR @BackupSoftware IS NULL))
1728 BEGIN
1729 SET @ErrorMessage = 'The value for the parameter @AdaptiveCompression is not supported.'
1730 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1731 SET @Error = @@ERROR
1732 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1733 END
1734
1735 IF (@ModificationLevel IS NOT NULL AND NOT ((@Version >= 12.06024 AND @Version < 13) OR @Version >= 13.05026)) OR (@ModificationLevel IS NOT NULL AND @ChangeBackupType = 'N') OR (@ModificationLevel IS NOT NULL AND @BackupType <> 'DIFF')
1736 BEGIN
1737 SET @ErrorMessage = 'The value for the parameter @ModificationLevel is not supported.'
1738 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1739 SET @Error = @@ERROR
1740 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1741 END
1742
1743 IF (@LogSizeSinceLastLogBackup IS NOT NULL AND NOT ((@Version >= 12.06024 AND @Version < 13) OR @Version >= 13.05026)) OR (@LogSizeSinceLastLogBackup IS NOT NULL AND @TimeSinceLastLogBackup IS NULL) OR (@LogSizeSinceLastLogBackup IS NULL AND @TimeSinceLastLogBackup IS NOT NULL) OR (@LogSizeSinceLastLogBackup IS NOT NULL AND @BackupType <> 'LOG')
1744 BEGIN
1745 SET @ErrorMessage = 'The value for the parameter @LogSizeSinceLastLogBackup is not supported.'
1746 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1747 SET @Error = @@ERROR
1748 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1749 END
1750
1751 IF (@TimeSinceLastLogBackup IS NOT NULL AND NOT ((@Version >= 12.06024 AND @Version < 13) OR @Version >= 13.05026)) OR (@TimeSinceLastLogBackup IS NOT NULL AND @LogSizeSinceLastLogBackup IS NULL) OR (@TimeSinceLastLogBackup IS NULL AND @LogSizeSinceLastLogBackup IS NOT NULL) OR (@TimeSinceLastLogBackup IS NOT NULL AND @BackupType <> 'LOG')
1752 BEGIN
1753 SET @ErrorMessage = 'The value for the parameter @TimeSinceLastLogBackup is not supported.'
1754 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1755 SET @Error = @@ERROR
1756 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1757 END
1758
1759 IF (@DataDomainBoostHost IS NOT NULL AND (@BackupSoftware <> 'DATA_DOMAIN_BOOST' OR @BackupSoftware IS NULL)) OR (@DataDomainBoostHost IS NULL AND @BackupSoftware = 'DATA_DOMAIN_BOOST')
1760 BEGIN
1761 SET @ErrorMessage = 'The value for the parameter @DataDomainBoostHost is not supported.'
1762 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1763 SET @Error = @@ERROR
1764 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1765 END
1766
1767 IF (@DataDomainBoostUser IS NOT NULL AND (@BackupSoftware <> 'DATA_DOMAIN_BOOST' OR @BackupSoftware IS NULL)) OR (@DataDomainBoostUser IS NULL AND @BackupSoftware = 'DATA_DOMAIN_BOOST')
1768 BEGIN
1769 SET @ErrorMessage = 'The value for the parameter @DataDomainBoostUser is not supported.'
1770 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1771 SET @Error = @@ERROR
1772 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1773 END
1774
1775 IF (@DataDomainBoostDevicePath IS NOT NULL AND (@BackupSoftware <> 'DATA_DOMAIN_BOOST' OR @BackupSoftware IS NULL)) OR (@DataDomainBoostDevicePath IS NULL AND @BackupSoftware = 'DATA_DOMAIN_BOOST')
1776 BEGIN
1777 SET @ErrorMessage = 'The value for the parameter @DataDomainBoostDevicePath is not supported.'
1778 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1779 SET @Error = @@ERROR
1780 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1781 END
1782
1783 IF @DataDomainBoostLockboxPath IS NOT NULL AND (@BackupSoftware <> 'DATA_DOMAIN_BOOST' OR @BackupSoftware IS NULL)
1784 BEGIN
1785 SET @ErrorMessage = 'The value for the parameter @DataDomainBoostLockboxPath is not supported.'
1786 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1787 SET @Error = @@ERROR
1788 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1789 END
1790
1791 IF @DirectoryStructure = ''
1792 BEGIN
1793 SET @ErrorMessage = 'The value for the parameter @DirectoryStructure is not supported.'
1794 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1795 SET @Error = @@ERROR
1796 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1797 END
1798
1799 IF @AvailabilityGroupDirectoryStructure = ''
1800 BEGIN
1801 SET @ErrorMessage = 'The value for the parameter @AvailabilityGroupDirectoryStructure is not supported.'
1802 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1803 SET @Error = @@ERROR
1804 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1805 END
1806
1807 IF @FileName IS NULL OR @FileName = '' OR @FileName NOT LIKE '%.{FileExtension}' OR (@NumberOfFiles > 1 AND @FileName NOT LIKE '%{FileNumber}%') OR @FileName LIKE '%{DirectorySeperator}%' OR @FileName LIKE '%/%' OR @FileName LIKE '%\%'
1808 BEGIN
1809 SET @ErrorMessage = 'The value for the parameter @FileName is not supported.'
1810 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1811 SET @Error = @@ERROR
1812 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1813 END
1814
1815 IF (SERVERPROPERTY('IsHadrEnabled') = 1 AND @AvailabilityGroupFileName IS NULL) OR @AvailabilityGroupFileName = '' OR @AvailabilityGroupFileName NOT LIKE '%.{FileExtension}' OR (@NumberOfFiles > 1 AND @AvailabilityGroupFileName NOT LIKE '%{FileNumber}%') OR @AvailabilityGroupFileName LIKE '%{DirectorySeperator}%' OR @AvailabilityGroupFileName LIKE '%/%' OR @AvailabilityGroupFileName LIKE '%\%'
1816 BEGIN
1817 SET @ErrorMessage = 'The value for the parameter @AvailabilityGroupFileName is not supported.'
1818 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1819 SET @Error = @@ERROR
1820 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1821 END
1822
1823 IF REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@DirectoryStructure,'{DirectorySeparator}',''),'{ServerName}',''),'{InstanceName}',''),'{ServiceName}',''),'{ClusterName}',''),'{AvailabilityGroupName}',''),'{DatabaseName}',''),'{BackupType}',''),'{Partial}',''),'{CopyOnly}',''),'{Description}',''),'{Year}',''),'{Month}',''),'{Day}',''),'{Hour}',''),'{Minute}',''),'{Second}',''),'{Millisecond}',''),'{MajorVersion}',''),'{MinorVersion}','') LIKE '%{%'
1824 OR REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@DirectoryStructure,'{DirectorySeparator}',''),'{ServerName}',''),'{InstanceName}',''),'{ServiceName}',''),'{ClusterName}',''),'{AvailabilityGroupName}',''),'{DatabaseName}',''),'{BackupType}',''),'{Partial}',''),'{CopyOnly}',''),'{Description}',''),'{Year}',''),'{Month}',''),'{Day}',''),'{Hour}',''),'{Minute}',''),'{Second}',''),'{Millisecond}',''),'{MajorVersion}',''),'{MinorVersion}','') LIKE '%}%'
1825 BEGIN
1826 SET @ErrorMessage = 'The parameter @DirectoryStructure contains one or more tokens that are not supported.'
1827 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1828 SET @Error = @@ERROR
1829 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1830 END
1831
1832 IF REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@AvailabilityGroupDirectoryStructure,'{DirectorySeparator}',''),'{ServerName}',''),'{InstanceName}',''),'{ServiceName}',''),'{ClusterName}',''),'{AvailabilityGroupName}',''),'{DatabaseName}',''),'{BackupType}',''),'{Partial}',''),'{CopyOnly}',''),'{Description}',''),'{Year}',''),'{Month}',''),'{Day}',''),'{Hour}',''),'{Minute}',''),'{Second}',''),'{Millisecond}',''),'{MajorVersion}',''),'{MinorVersion}','') LIKE '%{%'
1833 OR REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@AvailabilityGroupDirectoryStructure,'{DirectorySeparator}',''),'{ServerName}',''),'{InstanceName}',''),'{ServiceName}',''),'{ClusterName}',''),'{AvailabilityGroupName}',''),'{DatabaseName}',''),'{BackupType}',''),'{Partial}',''),'{CopyOnly}',''),'{Description}',''),'{Year}',''),'{Month}',''),'{Day}',''),'{Hour}',''),'{Minute}',''),'{Second}',''),'{Millisecond}',''),'{MajorVersion}',''),'{MinorVersion}','') LIKE '%}%'
1834 BEGIN
1835 SET @ErrorMessage = 'The parameter @AvailabilityGroupDirectoryStructure contains one or more tokens that are not supported.'
1836 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1837 SET @Error = @@ERROR
1838 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1839 END
1840
1841 IF REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@FileName,'{DirectorySeparator}',''),'{ServerName}',''),'{InstanceName}',''),'{ServiceName}',''),'{ClusterName}',''),'{AvailabilityGroupName}',''),'{DatabaseName}',''),'{BackupType}',''),'{Partial}',''),'{CopyOnly}',''),'{Description}',''),'{Year}',''),'{Month}',''),'{Day}',''),'{Hour}',''),'{Minute}',''),'{Second}',''),'{Millisecond}',''),'{FileNumber}',''),'{FileExtension}',''),'{MajorVersion}',''),'{MinorVersion}','') LIKE '%{%'
1842 OR REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@FileName,'{DirectorySeparator}',''),'{ServerName}',''),'{InstanceName}',''),'{ServiceName}',''),'{ClusterName}',''),'{AvailabilityGroupName}',''),'{DatabaseName}',''),'{BackupType}',''),'{Partial}',''),'{CopyOnly}',''),'{Description}',''),'{Year}',''),'{Month}',''),'{Day}',''),'{Hour}',''),'{Minute}',''),'{Second}',''),'{Millisecond}',''),'{FileNumber}',''),'{FileExtension}',''),'{MajorVersion}',''),'{MinorVersion}','') LIKE '%}%'
1843 BEGIN
1844 SET @ErrorMessage = 'The parameter @FileName contains one or more tokens that are not supported.'
1845 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1846 SET @Error = @@ERROR
1847 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1848 END
1849
1850 IF REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@AvailabilityGroupFileName,'{DirectorySeparator}',''),'{ServerName}',''),'{InstanceName}',''),'{ServiceName}',''),'{ClusterName}',''),'{AvailabilityGroupName}',''),'{DatabaseName}',''),'{BackupType}',''),'{Partial}',''),'{CopyOnly}',''),'{Description}',''),'{Year}',''),'{Month}',''),'{Day}',''),'{Hour}',''),'{Minute}',''),'{Second}',''),'{Millisecond}',''),'{FileNumber}',''),'{FileExtension}',''),'{MajorVersion}',''),'{MinorVersion}','') LIKE '%{%'
1851 OR REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@AvailabilityGroupFileName,'{DirectorySeparator}',''),'{ServerName}',''),'{InstanceName}',''),'{ServiceName}',''),'{ClusterName}',''),'{AvailabilityGroupName}',''),'{DatabaseName}',''),'{BackupType}',''),'{Partial}',''),'{CopyOnly}',''),'{Description}',''),'{Year}',''),'{Month}',''),'{Day}',''),'{Hour}',''),'{Minute}',''),'{Second}',''),'{Millisecond}',''),'{FileNumber}',''),'{FileExtension}',''),'{MajorVersion}',''),'{MinorVersion}','') LIKE '%}%'
1852 BEGIN
1853 SET @ErrorMessage = 'The parameter @AvailabilityGroupFileName contains one or more tokens that are not supported.'
1854 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1855 SET @Error = @@ERROR
1856 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1857 END
1858
1859 IF @FileExtensionFull LIKE '%.%'
1860 BEGIN
1861 SET @ErrorMessage = 'The value for the parameter @FileExtensionFull is not supported.'
1862 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1863 SET @Error = @@ERROR
1864 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1865 END
1866
1867 IF @FileExtensionDiff LIKE '%.%'
1868 BEGIN
1869 SET @ErrorMessage = 'The value for the parameter @FileExtensionDiff is not supported.'
1870 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1871 SET @Error = @@ERROR
1872 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1873 END
1874
1875 IF @FileExtensionLog LIKE '%.%'
1876 BEGIN
1877 SET @ErrorMessage = 'The value for the parameter @FileExtensionLog is not supported.'
1878 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1879 SET @Error = @@ERROR
1880 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1881 END
1882
1883 IF @Init NOT IN('Y','N') OR @Init IS NULL OR (@Init = 'Y' AND @BackupType = 'LOG') OR (@Init = 'Y' AND @BackupSoftware = 'DATA_DOMAIN_BOOST')
1884 BEGIN
1885 SET @ErrorMessage = 'The value for the parameter @Init is not supported.'
1886 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1887 SET @Error = @@ERROR
1888 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1889 END
1890
1891 IF @DatabaseOrder NOT IN('DATABASE_NAME_ASC','DATABASE_NAME_DESC','DATABASE_SIZE_ASC','DATABASE_SIZE_DESC','LOG_SIZE_SINCE_LAST_LOG_BACKUP_ASC','LOG_SIZE_SINCE_LAST_LOG_BACKUP_DESC') OR (@DatabaseOrder IN('LOG_SIZE_SINCE_LAST_LOG_BACKUP_ASC','LOG_SIZE_SINCE_LAST_LOG_BACKUP_DESC') AND NOT ((@Version >= 12.06024 AND @Version < 13) OR @Version >= 13.05026 OR SERVERPROPERTY('EngineEdition') = 8)) OR (@DatabaseOrder IS NOT NULL AND SERVERPROPERTY('EngineEdition') = 5)
1892 BEGIN
1893 SET @ErrorMessage = 'The value for the parameter @DatabaseOrder is not supported.'
1894 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1895 SET @Error = @@ERROR
1896 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1897 END
1898
1899 IF @DatabasesInParallel NOT IN('Y','N') OR @DatabasesInParallel IS NULL OR (@DatabasesInParallel = 'Y' AND SERVERPROPERTY('EngineEdition') = 5)
1900 BEGIN
1901 SET @ErrorMessage = 'The value for the parameter @DatabasesInParallel is not supported.'
1902 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1903 SET @Error = @@ERROR
1904 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1905 END
1906
1907 IF @LogToTable NOT IN('Y','N') OR @LogToTable IS NULL
1908 BEGIN
1909 SET @ErrorMessage = 'The value for the parameter @LogToTable is not supported.'
1910 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1911 SET @Error = @@ERROR
1912 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1913 END
1914
1915 IF @Execute NOT IN('Y','N') OR @Execute IS NULL
1916 BEGIN
1917 SET @ErrorMessage = 'The value for the parameter @Execute is not supported.'
1918 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1919 SET @Error = @@ERROR
1920 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1921 END
1922
1923 IF @Error <> 0
1924 BEGIN
1925 SET @ErrorMessage = 'The documentation is available at https://ola.hallengren.com/sql-server-backup.html.'
1926 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1927 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1928 SET @ReturnCode = @Error
1929 GOTO Logging
1930 END
1931
1932 ----------------------------------------------------------------------------------------------------
1933 --// Check that selected databases and availability groups exist //--
1934 ----------------------------------------------------------------------------------------------------
1935
1936 SET @ErrorMessage = ''
1937 SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + ', '
1938 FROM @SelectedDatabases
1939 WHERE DatabaseName NOT LIKE '%[%]%'
1940 AND DatabaseName NOT IN (SELECT DatabaseName FROM @tmpDatabases)
1941 IF @@ROWCOUNT > 0
1942 BEGIN
1943 SET @ErrorMessage = 'The following databases in the @Databases parameter do not exist: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.'
1944 RAISERROR('%s',10,1,@ErrorMessage) WITH NOWAIT
1945 SET @Error = @@ERROR
1946 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1947 END
1948
1949 SET @ErrorMessage = ''
1950 SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(AvailabilityGroupName) + ', '
1951 FROM @SelectedAvailabilityGroups
1952 WHERE AvailabilityGroupName NOT LIKE '%[%]%'
1953 AND AvailabilityGroupName NOT IN (SELECT AvailabilityGroupName FROM @tmpAvailabilityGroups)
1954 IF @@ROWCOUNT > 0
1955 BEGIN
1956 SET @ErrorMessage = 'The following availability groups do not exist: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.'
1957 RAISERROR('%s',10,1,@ErrorMessage) WITH NOWAIT
1958 SET @Error = @@ERROR
1959 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1960 END
1961
1962 ----------------------------------------------------------------------------------------------------
1963 --// Check @@SERVERNAME //--
1964 ----------------------------------------------------------------------------------------------------
1965
1966 IF @@SERVERNAME <> CAST(SERVERPROPERTY('ServerName') AS nvarchar(max)) AND SERVERPROPERTY('IsHadrEnabled') = 1
1967 BEGIN
1968 SET @ErrorMessage = 'The @@SERVERNAME does not match SERVERPROPERTY(''ServerName''). See ' + CASE WHEN SERVERPROPERTY('IsClustered') = 0 THEN 'https://docs.microsoft.com/en-us/sql/database-engine/install-windows/rename-a-computer-that-hosts-a-stand-alone-instance-of-sql-server' WHEN SERVERPROPERTY('IsClustered') = 1 THEN 'https://docs.microsoft.com/en-us/sql/sql-server/failover-clusters/install/rename-a-sql-server-failover-cluster-instance' END + '.'
1969 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
1970 SET @Error = @@ERROR
1971 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
1972 END
1973
1974 ----------------------------------------------------------------------------------------------------
1975 --// Check Availability Group cluster name //--
1976 ----------------------------------------------------------------------------------------------------
1977
1978 IF @Version >= 11 AND SERVERPROPERTY('IsHadrEnabled') = 1
1979 BEGIN
1980 SELECT @Cluster = NULLIF(cluster_name,'')
1981 FROM sys.dm_hadr_cluster
1982 END
1983
1984 ----------------------------------------------------------------------------------------------------
1985 --// Update database order //--
1986 ----------------------------------------------------------------------------------------------------
1987
1988 IF @DatabaseOrder IN('DATABASE_SIZE_ASC','DATABASE_SIZE_DESC')
1989 BEGIN
1990 UPDATE tmpDatabases
1991 SET DatabaseSize = (SELECT SUM(size) FROM sys.master_files WHERE [type] = 0 AND database_id = DB_ID(tmpDatabases.DatabaseName))
1992 FROM @tmpDatabases tmpDatabases
1993 END
1994
1995 IF @DatabaseOrder IN('LOG_SIZE_SINCE_LAST_LOG_BACKUP_ASC','LOG_SIZE_SINCE_LAST_LOG_BACKUP_DESC')
1996 BEGIN
1997 UPDATE tmpDatabases
1998 SET LogSizeSinceLastLogBackup = (SELECT log_since_last_log_backup_mb FROM sys.dm_db_log_stats(DB_ID(tmpDatabases.DatabaseName)))
1999 FROM @tmpDatabases tmpDatabases
2000 END
2001
2002 IF @DatabaseOrder IS NULL
2003 BEGIN
2004 WITH tmpDatabases AS (
2005 SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY StartPosition ASC, DatabaseName ASC) AS RowNumber
2006 FROM @tmpDatabases tmpDatabases
2007 WHERE Selected = 1
2008 )
2009 UPDATE tmpDatabases
2010 SET [Order] = RowNumber
2011 END
2012 ELSE
2013 IF @DatabaseOrder = 'DATABASE_NAME_ASC'
2014 BEGIN
2015 WITH tmpDatabases AS (
2016 SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY DatabaseName ASC) AS RowNumber
2017 FROM @tmpDatabases tmpDatabases
2018 WHERE Selected = 1
2019 )
2020 UPDATE tmpDatabases
2021 SET [Order] = RowNumber
2022 END
2023 ELSE
2024 IF @DatabaseOrder = 'DATABASE_NAME_DESC'
2025 BEGIN
2026 WITH tmpDatabases AS (
2027 SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY DatabaseName DESC) AS RowNumber
2028 FROM @tmpDatabases tmpDatabases
2029 WHERE Selected = 1
2030 )
2031 UPDATE tmpDatabases
2032 SET [Order] = RowNumber
2033 END
2034 ELSE
2035 IF @DatabaseOrder = 'DATABASE_SIZE_ASC'
2036 BEGIN
2037 WITH tmpDatabases AS (
2038 SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY DatabaseSize ASC) AS RowNumber
2039 FROM @tmpDatabases tmpDatabases
2040 WHERE Selected = 1
2041 )
2042 UPDATE tmpDatabases
2043 SET [Order] = RowNumber
2044 END
2045 ELSE
2046 IF @DatabaseOrder = 'DATABASE_SIZE_DESC'
2047 BEGIN
2048 WITH tmpDatabases AS (
2049 SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY DatabaseSize DESC) AS RowNumber
2050 FROM @tmpDatabases tmpDatabases
2051 WHERE Selected = 1
2052 )
2053 UPDATE tmpDatabases
2054 SET [Order] = RowNumber
2055 END
2056 ELSE
2057 IF @DatabaseOrder = 'LOG_SIZE_SINCE_LAST_LOG_BACKUP_ASC'
2058 BEGIN
2059 WITH tmpDatabases AS (
2060 SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY LogSizeSinceLastLogBackup ASC) AS RowNumber
2061 FROM @tmpDatabases tmpDatabases
2062 WHERE Selected = 1
2063 )
2064 UPDATE tmpDatabases
2065 SET [Order] = RowNumber
2066 END
2067 ELSE
2068 IF @DatabaseOrder = 'LOG_SIZE_SINCE_LAST_LOG_BACKUP_DESC'
2069 BEGIN
2070 WITH tmpDatabases AS (
2071 SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY LogSizeSinceLastLogBackup DESC) AS RowNumber
2072 FROM @tmpDatabases tmpDatabases
2073 WHERE Selected = 1
2074 )
2075 UPDATE tmpDatabases
2076 SET [Order] = RowNumber
2077 END
2078
2079 ----------------------------------------------------------------------------------------------------
2080 --// Update the queue //--
2081 ----------------------------------------------------------------------------------------------------
2082
2083 IF @DatabasesInParallel = 'Y'
2084 BEGIN
2085
2086 BEGIN TRY
2087
2088 SELECT @QueueID = QueueID
2089 FROM dbo.[Queue]
2090 WHERE SchemaName = @SchemaName
2091 AND ObjectName = @ObjectName
2092 AND [Parameters] = @Parameters
2093
2094 IF @QueueID IS NULL
2095 BEGIN
2096 BEGIN TRANSACTION
2097
2098 SELECT @QueueID = QueueID
2099 FROM dbo.[Queue] WITH (UPDLOCK, TABLOCK)
2100 WHERE SchemaName = @SchemaName
2101 AND ObjectName = @ObjectName
2102 AND [Parameters] = @Parameters
2103
2104 IF @QueueID IS NULL
2105 BEGIN
2106 INSERT INTO dbo.[Queue] (SchemaName, ObjectName, [Parameters])
2107 SELECT @SchemaName, @ObjectName, @Parameters
2108
2109 SET @QueueID = SCOPE_IDENTITY()
2110 END
2111
2112 COMMIT TRANSACTION
2113 END
2114
2115 BEGIN TRANSACTION
2116
2117 UPDATE [Queue]
2118 SET QueueStartTime = GETDATE(),
2119 SessionID = @@SPID,
2120 RequestID = (SELECT request_id FROM sys.dm_exec_requests WHERE session_id = @@SPID),
2121 RequestStartTime = (SELECT start_time FROM sys.dm_exec_requests WHERE session_id = @@SPID)
2122 FROM dbo.[Queue] [Queue]
2123 WHERE QueueID = @QueueID
2124 AND NOT EXISTS (SELECT *
2125 FROM sys.dm_exec_requests
2126 WHERE session_id = [Queue].SessionID
2127 AND request_id = [Queue].RequestID
2128 AND start_time = [Queue].RequestStartTime)
2129 AND NOT EXISTS (SELECT *
2130 FROM dbo.QueueDatabase QueueDatabase
2131 INNER JOIN sys.dm_exec_requests ON QueueDatabase.SessionID = session_id AND QueueDatabase.RequestID = request_id AND QueueDatabase.RequestStartTime = start_time
2132 WHERE QueueDatabase.QueueID = @QueueID)
2133
2134 IF @@ROWCOUNT = 1
2135 BEGIN
2136 INSERT INTO dbo.QueueDatabase (QueueID, DatabaseName)
2137 SELECT @QueueID AS QueueID,
2138 DatabaseName
2139 FROM @tmpDatabases tmpDatabases
2140 WHERE Selected = 1
2141 AND NOT EXISTS (SELECT * FROM dbo.QueueDatabase WHERE DatabaseName = tmpDatabases.DatabaseName AND QueueID = @QueueID)
2142
2143 DELETE QueueDatabase
2144 FROM dbo.QueueDatabase QueueDatabase
2145 WHERE QueueID = @QueueID
2146 AND NOT EXISTS (SELECT * FROM @tmpDatabases tmpDatabases WHERE DatabaseName = QueueDatabase.DatabaseName AND Selected = 1)
2147
2148 UPDATE QueueDatabase
2149 SET DatabaseOrder = tmpDatabases.[Order]
2150 FROM dbo.QueueDatabase QueueDatabase
2151 INNER JOIN @tmpDatabases tmpDatabases ON QueueDatabase.DatabaseName = tmpDatabases.DatabaseName
2152 WHERE QueueID = @QueueID
2153 END
2154
2155 COMMIT TRANSACTION
2156
2157 SELECT @QueueStartTime = QueueStartTime
2158 FROM dbo.[Queue]
2159 WHERE QueueID = @QueueID
2160
2161 END TRY
2162
2163 BEGIN CATCH
2164 IF XACT_STATE() <> 0
2165 BEGIN
2166 ROLLBACK TRANSACTION
2167 END
2168 SET @ErrorMessage = 'Msg ' + CAST(ERROR_NUMBER() AS nvarchar) + ', ' + ISNULL(ERROR_MESSAGE(),'')
2169 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
2170 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
2171 SET @ReturnCode = ERROR_NUMBER()
2172 GOTO Logging
2173 END CATCH
2174
2175 END
2176
2177 ----------------------------------------------------------------------------------------------------
2178 --// Execute backup commands //--
2179 ----------------------------------------------------------------------------------------------------
2180
2181 WHILE (1 = 1)
2182 BEGIN
2183
2184 IF @DatabasesInParallel = 'Y'
2185 BEGIN
2186 UPDATE QueueDatabase
2187 SET DatabaseStartTime = NULL,
2188 SessionID = NULL,
2189 RequestID = NULL,
2190 RequestStartTime = NULL
2191 FROM dbo.QueueDatabase QueueDatabase
2192 WHERE QueueID = @QueueID
2193 AND DatabaseStartTime IS NOT NULL
2194 AND DatabaseEndTime IS NULL
2195 AND NOT EXISTS (SELECT * FROM sys.dm_exec_requests WHERE session_id = QueueDatabase.SessionID AND request_id = QueueDatabase.RequestID AND start_time = QueueDatabase.RequestStartTime)
2196
2197 UPDATE QueueDatabase
2198 SET DatabaseStartTime = GETDATE(),
2199 DatabaseEndTime = NULL,
2200 SessionID = @@SPID,
2201 RequestID = (SELECT request_id FROM sys.dm_exec_requests WHERE session_id = @@SPID),
2202 RequestStartTime = (SELECT start_time FROM sys.dm_exec_requests WHERE session_id = @@SPID),
2203 @CurrentDatabaseName = DatabaseName,
2204 @CurrentDatabaseNameFS = (SELECT DatabaseNameFS FROM @tmpDatabases WHERE DatabaseName = QueueDatabase.DatabaseName)
2205 FROM (SELECT TOP 1 DatabaseStartTime,
2206 DatabaseEndTime,
2207 SessionID,
2208 RequestID,
2209 RequestStartTime,
2210 DatabaseName
2211 FROM dbo.QueueDatabase
2212 WHERE QueueID = @QueueID
2213 AND (DatabaseStartTime < @QueueStartTime OR DatabaseStartTime IS NULL)
2214 AND NOT (DatabaseStartTime IS NOT NULL AND DatabaseEndTime IS NULL)
2215 ORDER BY DatabaseOrder ASC
2216 ) QueueDatabase
2217 END
2218 ELSE
2219 BEGIN
2220 SELECT TOP 1 @CurrentDBID = ID,
2221 @CurrentDatabaseName = DatabaseName,
2222 @CurrentDatabaseNameFS = DatabaseNameFS
2223 FROM @tmpDatabases
2224 WHERE Selected = 1
2225 AND Completed = 0
2226 ORDER BY [Order] ASC
2227 END
2228
2229 IF @@ROWCOUNT = 0
2230 BEGIN
2231 BREAK
2232 END
2233
2234 SET @CurrentDatabaseID = DB_ID(@CurrentDatabaseName)
2235
2236 IF DATABASEPROPERTYEX(@CurrentDatabaseName,'Status') = 'ONLINE'
2237 BEGIN
2238 IF EXISTS (SELECT * FROM sys.database_recovery_status WHERE database_id = @CurrentDatabaseID AND database_guid IS NOT NULL)
2239 BEGIN
2240 SET @CurrentIsDatabaseAccessible = 1
2241 END
2242 ELSE
2243 BEGIN
2244 SET @CurrentIsDatabaseAccessible = 0
2245 END
2246 END
2247
2248 IF @Version >= 11 AND SERVERPROPERTY('IsHadrEnabled') = 1
2249 BEGIN
2250 SELECT @CurrentAvailabilityGroup = availability_groups.name,
2251 @CurrentAvailabilityGroupRole = dm_hadr_availability_replica_states.role_desc,
2252 @CurrentAvailabilityGroupBackupPreference = UPPER(availability_groups.automated_backup_preference_desc)
2253 FROM sys.databases databases
2254 INNER JOIN sys.dm_hadr_availability_replica_states dm_hadr_availability_replica_states ON databases.replica_id = dm_hadr_availability_replica_states.replica_id
2255 INNER JOIN sys.availability_groups availability_groups ON dm_hadr_availability_replica_states.group_id = availability_groups.group_id
2256 WHERE databases.name = @CurrentDatabaseName
2257 END
2258
2259 IF @Version >= 11 AND SERVERPROPERTY('IsHadrEnabled') = 1 AND @CurrentAvailabilityGroup IS NOT NULL
2260 BEGIN
2261 SELECT @CurrentIsPreferredBackupReplica = sys.fn_hadr_backup_is_preferred_replica(@CurrentDatabaseName)
2262 END
2263
2264 SELECT @CurrentDifferentialBaseLSN = differential_base_lsn
2265 FROM sys.master_files
2266 WHERE database_id = @CurrentDatabaseID
2267 AND [type] = 0
2268 AND [file_id] = 1
2269
2270 -- Workaround for a bug in SQL Server 2005
2271 IF @Version >= 9 AND @Version < 10
2272 AND EXISTS(SELECT * FROM sys.master_files WHERE database_id = @CurrentDatabaseID AND [type] = 0 AND [file_id] = 1 AND differential_base_lsn IS NOT NULL AND differential_base_guid IS NOT NULL AND differential_base_time IS NULL)
2273 BEGIN
2274 SET @CurrentDifferentialBaseLSN = NULL
2275 END
2276
2277 IF DATABASEPROPERTYEX(@CurrentDatabaseName,'Status') = 'ONLINE'
2278 BEGIN
2279 SELECT @CurrentLogLSN = last_log_backup_lsn
2280 FROM sys.database_recovery_status
2281 WHERE database_id = @CurrentDatabaseID
2282 END
2283
2284 IF DATABASEPROPERTYEX(@CurrentDatabaseName,'Status') = 'ONLINE' AND ((@Version >= 12.06024 AND @Version < 13) OR @Version >= 13.05026) AND (@CurrentAvailabilityGroupRole = 'PRIMARY' OR @CurrentAvailabilityGroupRole IS NULL)
2285 BEGIN
2286 SET @CurrentCommand07 = 'SELECT @ParamAllocatedExtentPageCount = SUM(allocated_extent_page_count), @ParamModifiedExtentPageCount = SUM(modified_extent_page_count) FROM ' + QUOTENAME(@CurrentDatabaseName) + '.sys.dm_db_file_space_usage'
2287
2288 EXECUTE sp_executesql @statement = @CurrentCommand07, @params = N'@ParamAllocatedExtentPageCount bigint OUTPUT, @ParamModifiedExtentPageCount bigint OUTPUT', @ParamAllocatedExtentPageCount = @CurrentAllocatedExtentPageCount OUTPUT, @ParamModifiedExtentPageCount = @CurrentModifiedExtentPageCount OUTPUT
2289 END
2290
2291 SET @CurrentBackupType = @BackupType
2292
2293 IF @ChangeBackupType = 'Y'
2294 BEGIN
2295 IF @CurrentBackupType = 'LOG' AND DATABASEPROPERTYEX(@CurrentDatabaseName,'Recovery') <> 'SIMPLE' AND @CurrentLogLSN IS NULL AND @CurrentDatabaseName <> 'master'
2296 BEGIN
2297 SET @CurrentBackupType = 'DIFF'
2298 END
2299 IF @CurrentBackupType = 'DIFF' AND (@CurrentDatabaseName = 'master' OR @CurrentDifferentialBaseLSN IS NULL OR (@CurrentModifiedExtentPageCount * 1. / @CurrentAllocatedExtentPageCount * 100 >= @ModificationLevel))
2300 BEGIN
2301 SET @CurrentBackupType = 'FULL'
2302 END
2303 END
2304
2305 IF DATABASEPROPERTYEX(@CurrentDatabaseName,'Status') = 'ONLINE' AND ((@Version >= 12.06024 AND @Version < 13) OR @Version >= 13.05026)
2306 BEGIN
2307 SELECT @CurrentLastLogBackup = log_backup_time,
2308 @CurrentLogSizeSinceLastLogBackup = log_since_last_log_backup_mb
2309 FROM sys.dm_db_log_stats (@CurrentDatabaseID)
2310 END
2311
2312 IF @CurrentBackupType = 'DIFF'
2313 BEGIN
2314 SELECT @CurrentDifferentialBaseIsSnapshot = is_snapshot
2315 FROM msdb.dbo.backupset
2316 WHERE database_name = @CurrentDatabaseName
2317 AND [type] = 'D'
2318 AND checkpoint_lsn = @CurrentDifferentialBaseLSN
2319 END
2320
2321 IF @ChangeBackupType = 'Y'
2322 BEGIN
2323 IF @CurrentBackupType = 'DIFF' AND @CurrentDifferentialBaseIsSnapshot = 1
2324 BEGIN
2325 SET @CurrentBackupType = 'FULL'
2326 END
2327 END
2328
2329 SELECT @CurrentDatabaseMirroringRole = UPPER(mirroring_role_desc)
2330 FROM sys.database_mirroring
2331 WHERE database_id = @CurrentDatabaseID
2332
2333 IF EXISTS (SELECT * FROM msdb.dbo.log_shipping_primary_databases WHERE primary_database = @CurrentDatabaseName)
2334 BEGIN
2335 SET @CurrentLogShippingRole = 'PRIMARY'
2336 END
2337 ELSE
2338 IF EXISTS (SELECT * FROM msdb.dbo.log_shipping_secondary_databases WHERE secondary_database = @CurrentDatabaseName)
2339 BEGIN
2340 SET @CurrentLogShippingRole = 'SECONDARY'
2341 END
2342
2343 SELECT @CurrentIsReadOnly = is_read_only
2344 FROM sys.databases
2345 WHERE name = @CurrentDatabaseName
2346
2347 IF @Version >= 10
2348 BEGIN
2349 SET @CurrentCommand06 = 'SELECT @ParamIsEncrypted = is_encrypted FROM sys.databases WHERE name = @ParamDatabaseName'
2350
2351 EXECUTE sp_executesql @statement = @CurrentCommand06, @params = N'@ParamDatabaseName nvarchar(max), @ParamIsEncrypted bit OUTPUT', @ParamDatabaseName = @CurrentDatabaseName, @ParamIsEncrypted = @CurrentIsEncrypted OUTPUT
2352 END
2353
2354 SET @DatabaseMessage = 'Date and time: ' + CONVERT(nvarchar,GETDATE(),120)
2355 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
2356
2357 SET @DatabaseMessage = 'Database: ' + QUOTENAME(@CurrentDatabaseName)
2358 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
2359
2360 SET @DatabaseMessage = 'Status: ' + CAST(DATABASEPROPERTYEX(@CurrentDatabaseName,'Status') AS nvarchar)
2361 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
2362
2363 SET @DatabaseMessage = 'Standby: ' + CASE WHEN DATABASEPROPERTYEX(@CurrentDatabaseName,'IsInStandBy') = 1 THEN 'Yes' ELSE 'No' END
2364 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
2365
2366 SET @DatabaseMessage = 'Updateability: ' + CASE WHEN @CurrentIsReadOnly = 1 THEN 'READ_ONLY' WHEN @CurrentIsReadOnly = 0 THEN 'READ_WRITE' END
2367 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
2368
2369 SET @DatabaseMessage = 'User access: ' + CAST(DATABASEPROPERTYEX(@CurrentDatabaseName,'UserAccess') AS nvarchar)
2370 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
2371
2372 IF @CurrentIsDatabaseAccessible IS NOT NULL
2373 BEGIN
2374 SET @DatabaseMessage = 'Is accessible: ' + CASE WHEN @CurrentIsDatabaseAccessible = 1 THEN 'Yes' ELSE 'No' END
2375 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
2376 END
2377
2378 SET @DatabaseMessage = 'Recovery model: ' + CAST(DATABASEPROPERTYEX(@CurrentDatabaseName,'Recovery') AS nvarchar)
2379 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
2380
2381 SET @DatabaseMessage = 'Encrypted: ' + CASE WHEN @CurrentIsEncrypted = 1 THEN 'Yes' WHEN @CurrentIsEncrypted = 0 THEN 'No' ELSE 'N/A' END
2382 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
2383
2384 IF @CurrentAvailabilityGroup IS NOT NULL
2385 BEGIN
2386 SET @DatabaseMessage = 'Availability group: ' + ISNULL(@CurrentAvailabilityGroup,'N/A')
2387 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
2388
2389 SET @DatabaseMessage = 'Availability group role: ' + ISNULL(@CurrentAvailabilityGroupRole,'N/A')
2390 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
2391
2392 SET @DatabaseMessage = 'Availability group backup preference: ' + ISNULL(@CurrentAvailabilityGroupBackupPreference,'N/A')
2393 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
2394
2395 SET @DatabaseMessage = 'Is preferred backup replica: ' + CASE WHEN @CurrentIsPreferredBackupReplica = 1 THEN 'Yes' WHEN @CurrentIsPreferredBackupReplica = 0 THEN 'No' ELSE 'N/A' END
2396 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
2397 END
2398
2399 IF @CurrentDatabaseMirroringRole IS NOT NULL
2400 BEGIN
2401 SET @DatabaseMessage = 'Database mirroring role: ' + @CurrentDatabaseMirroringRole
2402 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
2403 END
2404
2405 IF @CurrentLogShippingRole IS NOT NULL
2406 BEGIN
2407 SET @DatabaseMessage = 'Log shipping role: ' + @CurrentLogShippingRole
2408 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
2409 END
2410
2411 SET @DatabaseMessage = 'Differential base LSN: ' + ISNULL(CAST(@CurrentDifferentialBaseLSN AS nvarchar),'N/A')
2412 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
2413
2414 IF @CurrentBackupType = 'DIFF'
2415 BEGIN
2416 SET @DatabaseMessage = 'Differential base is snapshot: ' + CASE WHEN @CurrentDifferentialBaseIsSnapshot = 1 THEN 'Yes' WHEN @CurrentDifferentialBaseIsSnapshot = 0 THEN 'No' ELSE 'N/A' END
2417 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
2418 END
2419
2420 SET @DatabaseMessage = 'Last log backup LSN: ' + ISNULL(CAST(@CurrentLogLSN AS nvarchar),'N/A')
2421 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
2422
2423 IF @CurrentBackupType IN('DIFF','FULL') AND ((@Version >= 12.06024 AND @Version < 13) OR @Version >= 13.05026)
2424 BEGIN
2425 SET @DatabaseMessage = 'Allocated extent page count: ' + ISNULL(CAST(@CurrentAllocatedExtentPageCount AS nvarchar),'N/A')
2426 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
2427
2428 SET @DatabaseMessage = 'Modified extent page count: ' + ISNULL(CAST(@CurrentModifiedExtentPageCount AS nvarchar),'N/A')
2429 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
2430 END
2431
2432 IF @CurrentBackupType = 'LOG' AND ((@Version >= 12.06024 AND @Version < 13) OR @Version >= 13.05026)
2433 BEGIN
2434 SET @DatabaseMessage = 'Last log backup: ' + ISNULL(CONVERT(nvarchar(19),@CurrentLastLogBackup,120),'N/A')
2435 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
2436
2437 SET @DatabaseMessage = 'Log size since last log backup (MB): ' + ISNULL(CAST(@CurrentLogSizeSinceLastLogBackup AS nvarchar),'N/A')
2438 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
2439 END
2440
2441 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
2442
2443 IF DATABASEPROPERTYEX(@CurrentDatabaseName,'Status') = 'ONLINE'
2444 AND (@CurrentIsDatabaseAccessible = 1 OR @CurrentIsDatabaseAccessible IS NULL)
2445 AND DATABASEPROPERTYEX(@CurrentDatabaseName,'IsInStandBy') = 0
2446 AND NOT (@CurrentBackupType = 'LOG' AND (DATABASEPROPERTYEX(@CurrentDatabaseName,'Recovery') = 'SIMPLE' OR @CurrentLogLSN IS NULL))
2447 AND NOT (@CurrentBackupType = 'DIFF' AND @CurrentDifferentialBaseLSN IS NULL)
2448 AND NOT (@CurrentBackupType IN('DIFF','LOG') AND @CurrentDatabaseName = 'master')
2449 AND NOT (@CurrentAvailabilityGroup IS NOT NULL AND @CurrentBackupType = 'FULL' AND @CopyOnly = 'N' AND (@CurrentAvailabilityGroupRole <> 'PRIMARY' OR @CurrentAvailabilityGroupRole IS NULL))
2450 AND NOT (@CurrentAvailabilityGroup IS NOT NULL AND @CurrentBackupType = 'FULL' AND @CopyOnly = 'Y' AND (@CurrentIsPreferredBackupReplica <> 1 OR @CurrentIsPreferredBackupReplica IS NULL) AND @OverrideBackupPreference = 'N')
2451 AND NOT (@CurrentAvailabilityGroup IS NOT NULL AND @CurrentBackupType = 'DIFF' AND (@CurrentAvailabilityGroupRole <> 'PRIMARY' OR @CurrentAvailabilityGroupRole IS NULL))
2452 AND NOT (@CurrentAvailabilityGroup IS NOT NULL AND @CurrentBackupType = 'LOG' AND @CopyOnly = 'N' AND (@CurrentIsPreferredBackupReplica <> 1 OR @CurrentIsPreferredBackupReplica IS NULL) AND @OverrideBackupPreference = 'N')
2453 AND NOT (@CurrentAvailabilityGroup IS NOT NULL AND @CurrentBackupType = 'LOG' AND @CopyOnly = 'Y' AND (@CurrentAvailabilityGroupRole <> 'PRIMARY' OR @CurrentAvailabilityGroupRole IS NULL))
2454 AND NOT ((@CurrentLogShippingRole = 'PRIMARY' AND @CurrentLogShippingRole IS NOT NULL) AND @CurrentBackupType = 'LOG')
2455 AND NOT (@CurrentIsReadOnly = 1 AND @Updateability = 'READ_WRITE')
2456 AND NOT (@CurrentIsReadOnly = 0 AND @Updateability = 'READ_ONLY')
2457 AND NOT (@CurrentBackupType = 'LOG' AND @LogSizeSinceLastLogBackup IS NOT NULL AND @TimeSinceLastLogBackup IS NOT NULL AND NOT(@CurrentLogSizeSinceLastLogBackup >= @LogSizeSinceLastLogBackup OR @CurrentLogSizeSinceLastLogBackup IS NULL OR DATEDIFF(SECOND,@CurrentLastLogBackup,GETDATE()) >= @TimeSinceLastLogBackup OR @CurrentLastLogBackup IS NULL))
2458 BEGIN
2459
2460 IF @CurrentBackupType = 'LOG' AND (@CleanupTime IS NOT NULL OR @MirrorCleanupTime IS NOT NULL)
2461 BEGIN
2462 SELECT @CurrentLatestBackup = MAX(backup_finish_date)
2463 FROM msdb.dbo.backupset
2464 WHERE ([type] IN('D','I')
2465 OR database_backup_lsn < @CurrentDifferentialBaseLSN)
2466 AND is_damaged = 0
2467 AND database_name = @CurrentDatabaseName
2468 END
2469
2470 SET @CurrentDate = GETDATE()
2471
2472 INSERT INTO @CurrentCleanupDates (CleanupDate)
2473 SELECT @CurrentDate
2474
2475 IF @CurrentBackupType = 'LOG'
2476 BEGIN
2477 INSERT INTO @CurrentCleanupDates (CleanupDate)
2478 SELECT @CurrentLatestBackup
2479 END
2480
2481 SELECT @CurrentDirectoryStructure = CASE
2482 WHEN @CurrentAvailabilityGroup IS NOT NULL THEN @AvailabilityGroupDirectoryStructure
2483 ELSE @DirectoryStructure
2484 END
2485
2486 IF @CurrentDirectoryStructure IS NOT NULL
2487 BEGIN
2488 -- Directory structure - remove tokens that are not needed
2489 IF @ReadWriteFileGroups = 'N' SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{Partial}','')
2490 IF @CopyOnly = 'N' SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{CopyOnly}','')
2491 IF @Cluster IS NULL SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{ClusterName}','')
2492 IF @CurrentAvailabilityGroup IS NULL SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{AvailabilityGroupName}','')
2493 IF SERVERPROPERTY('InstanceName') IS NULL SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{InstanceName}','')
2494 IF @@SERVICENAME IS NULL SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{ServiceName}','')
2495 IF @Description IS NULL SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{Description}','')
2496
2497 IF @Directory IS NULL AND @MirrorDirectory IS NULL AND @URL IS NULL AND @DefaultDirectory LIKE '%' + '.' + @@SERVICENAME + @DirectorySeparator + 'MSSQL' + @DirectorySeparator + 'Backup'
2498 BEGIN
2499 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{ServerName}','')
2500 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{InstanceName}','')
2501 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{ClusterName}','')
2502 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{AvailabilityGroupName}','')
2503 END
2504
2505 WHILE (@Updated = 1 OR @Updated IS NULL)
2506 BEGIN
2507 SET @Updated = 0
2508
2509 IF CHARINDEX('\',@CurrentDirectoryStructure) > 0
2510 BEGIN
2511 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'\','{DirectorySeparator}')
2512 SET @Updated = 1
2513 END
2514
2515 IF CHARINDEX('/',@CurrentDirectoryStructure) > 0
2516 BEGIN
2517 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'/','{DirectorySeparator}')
2518 SET @Updated = 1
2519 END
2520
2521 IF CHARINDEX('__',@CurrentDirectoryStructure) > 0
2522 BEGIN
2523 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'__','_')
2524 SET @Updated = 1
2525 END
2526
2527 IF CHARINDEX('--',@CurrentDirectoryStructure) > 0
2528 BEGIN
2529 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'--','-')
2530 SET @Updated = 1
2531 END
2532
2533 IF CHARINDEX('{DirectorySeparator}{DirectorySeparator}',@CurrentDirectoryStructure) > 0
2534 BEGIN
2535 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{DirectorySeparator}{DirectorySeparator}','{DirectorySeparator}')
2536 SET @Updated = 1
2537 END
2538
2539 IF CHARINDEX('{DirectorySeparator}$',@CurrentDirectoryStructure) > 0
2540 BEGIN
2541 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{DirectorySeparator}$','{DirectorySeparator}')
2542 SET @Updated = 1
2543 END
2544 IF CHARINDEX('${DirectorySeparator}',@CurrentDirectoryStructure) > 0
2545 BEGIN
2546 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'${DirectorySeparator}','{DirectorySeparator}')
2547 SET @Updated = 1
2548 END
2549
2550 IF CHARINDEX('{DirectorySeparator}_',@CurrentDirectoryStructure) > 0
2551 BEGIN
2552 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{DirectorySeparator}_','{DirectorySeparator}')
2553 SET @Updated = 1
2554 END
2555 IF CHARINDEX('_{DirectorySeparator}',@CurrentDirectoryStructure) > 0
2556 BEGIN
2557 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'_{DirectorySeparator}','{DirectorySeparator}')
2558 SET @Updated = 1
2559 END
2560
2561 IF CHARINDEX('{DirectorySeparator}-',@CurrentDirectoryStructure) > 0
2562 BEGIN
2563 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{DirectorySeparator}-','{DirectorySeparator}')
2564 SET @Updated = 1
2565 END
2566 IF CHARINDEX('-{DirectorySeparator}',@CurrentDirectoryStructure) > 0
2567 BEGIN
2568 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'-{DirectorySeparator}','{DirectorySeparator}')
2569 SET @Updated = 1
2570 END
2571
2572 IF CHARINDEX('_$',@CurrentDirectoryStructure) > 0
2573 BEGIN
2574 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'_$','_')
2575 SET @Updated = 1
2576 END
2577 IF CHARINDEX('$_',@CurrentDirectoryStructure) > 0
2578 BEGIN
2579 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'$_','_')
2580 SET @Updated = 1
2581 END
2582
2583 IF CHARINDEX('-$',@CurrentDirectoryStructure) > 0
2584 BEGIN
2585 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'-$','-')
2586 SET @Updated = 1
2587 END
2588 IF CHARINDEX('$-',@CurrentDirectoryStructure) > 0
2589 BEGIN
2590 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'$-','-')
2591 SET @Updated = 1
2592 END
2593
2594 IF LEFT(@CurrentDirectoryStructure,1) = '_'
2595 BEGIN
2596 SET @CurrentDirectoryStructure = RIGHT(@CurrentDirectoryStructure,LEN(@CurrentDirectoryStructure) - 1)
2597 SET @Updated = 1
2598 END
2599 IF RIGHT(@CurrentDirectoryStructure,1) = '_'
2600 BEGIN
2601 SET @CurrentDirectoryStructure = LEFT(@CurrentDirectoryStructure,LEN(@CurrentDirectoryStructure) - 1)
2602 SET @Updated = 1
2603 END
2604
2605 IF LEFT(@CurrentDirectoryStructure,1) = '-'
2606 BEGIN
2607 SET @CurrentDirectoryStructure = RIGHT(@CurrentDirectoryStructure,LEN(@CurrentDirectoryStructure) - 1)
2608 SET @Updated = 1
2609 END
2610 IF RIGHT(@CurrentDirectoryStructure,1) = '-'
2611 BEGIN
2612 SET @CurrentDirectoryStructure = LEFT(@CurrentDirectoryStructure,LEN(@CurrentDirectoryStructure) - 1)
2613 SET @Updated = 1
2614 END
2615
2616 IF LEFT(@CurrentDirectoryStructure,1) = '$'
2617 BEGIN
2618 SET @CurrentDirectoryStructure = RIGHT(@CurrentDirectoryStructure,LEN(@CurrentDirectoryStructure) - 1)
2619 SET @Updated = 1
2620 END
2621 IF RIGHT(@CurrentDirectoryStructure,1) = '$'
2622 BEGIN
2623 SET @CurrentDirectoryStructure = LEFT(@CurrentDirectoryStructure,LEN(@CurrentDirectoryStructure) - 1)
2624 SET @Updated = 1
2625 END
2626
2627 IF LEFT(@CurrentDirectoryStructure,20) = '{DirectorySeparator}'
2628 BEGIN
2629 SET @CurrentDirectoryStructure = RIGHT(@CurrentDirectoryStructure,LEN(@CurrentDirectoryStructure) - 20)
2630 SET @Updated = 1
2631 END
2632 IF RIGHT(@CurrentDirectoryStructure,20) = '{DirectorySeparator}'
2633 BEGIN
2634 SET @CurrentDirectoryStructure = LEFT(@CurrentDirectoryStructure,LEN(@CurrentDirectoryStructure) - 20)
2635 SET @Updated = 1
2636 END
2637 END
2638
2639 SET @Updated = NULL
2640
2641 -- Directory structure - replace tokens with real values
2642 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{DirectorySeparator}',@DirectorySeparator)
2643 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{ServerName}',CASE WHEN SERVERPROPERTY('EngineEdition') = 8 THEN LEFT(CAST(SERVERPROPERTY('ServerName') AS nvarchar(max)),CHARINDEX('.',CAST(SERVERPROPERTY('ServerName') AS nvarchar(max))) - 1) ELSE CAST(SERVERPROPERTY('MachineName') AS nvarchar(max)) END)
2644 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{InstanceName}',ISNULL(CAST(SERVERPROPERTY('InstanceName') AS nvarchar(max)),''))
2645 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{ServiceName}',ISNULL(@@SERVICENAME,''))
2646 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{ClusterName}',ISNULL(@Cluster,''))
2647 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{AvailabilityGroupName}',ISNULL(@CurrentAvailabilityGroup,''))
2648 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{DatabaseName}',@CurrentDatabaseNameFS)
2649 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{BackupType}',@CurrentBackupType)
2650 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{Partial}','PARTIAL')
2651 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{CopyOnly}','COPY_ONLY')
2652 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{Description}',LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(ISNULL(@Description,''),'\',''),'/',''),':',''),'*',''),'?',''),'"',''),'<',''),'>',''),'|',''))))
2653 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{Year}',CAST(DATEPART(YEAR,@CurrentDate) AS nvarchar))
2654 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{Month}',RIGHT('0' + CAST(DATEPART(MONTH,@CurrentDate) AS nvarchar),2))
2655 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{Day}',RIGHT('0' + CAST(DATEPART(DAY,@CurrentDate) AS nvarchar),2))
2656 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{Hour}',RIGHT('0' + CAST(DATEPART(HOUR,@CurrentDate) AS nvarchar),2))
2657 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{Minute}',RIGHT('0' + CAST(DATEPART(MINUTE,@CurrentDate) AS nvarchar),2))
2658 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{Second}',RIGHT('0' + CAST(DATEPART(SECOND,@CurrentDate) AS nvarchar),2))
2659 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{Millisecond}',RIGHT('00' + CAST(DATEPART(MILLISECOND,@CurrentDate) AS nvarchar),3))
2660 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{MajorVersion}',ISNULL(CAST(SERVERPROPERTY('ProductMajorVersion') AS nvarchar),PARSENAME(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar),4)))
2661 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{MinorVersion}',ISNULL(CAST(SERVERPROPERTY('ProductMinorVersion') AS nvarchar),PARSENAME(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar),3)))
2662 END
2663
2664 INSERT INTO @CurrentDirectories (ID, DirectoryPath, Mirror, DirectoryNumber, CreateCompleted, CleanupCompleted)
2665 SELECT ROW_NUMBER() OVER (ORDER BY ID),
2666 DirectoryPath + CASE WHEN @CurrentDirectoryStructure IS NOT NULL THEN @DirectorySeparator + @CurrentDirectoryStructure ELSE '' END,
2667 Mirror,
2668 ROW_NUMBER() OVER (PARTITION BY Mirror ORDER BY ID ASC),
2669 0,
2670 0
2671 FROM @Directories
2672 ORDER BY ID ASC
2673
2674 INSERT INTO @CurrentURLs (ID, DirectoryPath, Mirror, DirectoryNumber)
2675 SELECT ROW_NUMBER() OVER (ORDER BY ID),
2676 DirectoryPath + CASE WHEN @CurrentDirectoryStructure IS NOT NULL THEN @DirectorySeparator + @CurrentDirectoryStructure ELSE '' END,
2677 Mirror,
2678 ROW_NUMBER() OVER (PARTITION BY Mirror ORDER BY ID ASC)
2679 FROM @URLs
2680 ORDER BY ID ASC
2681
2682 SELECT @CurrentDatabaseFileName = CASE
2683 WHEN @CurrentAvailabilityGroup IS NOT NULL THEN @AvailabilityGroupFileName
2684 ELSE @FileName
2685 END
2686
2687 -- File name - remove tokens that are not needed
2688 IF @ReadWriteFileGroups = 'N' SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{Partial}','')
2689 IF @CopyOnly = 'N' SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{CopyOnly}','')
2690 IF @Cluster IS NULL SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{ClusterName}','')
2691 IF @CurrentAvailabilityGroup IS NULL SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{AvailabilityGroupName}','')
2692 IF SERVERPROPERTY('InstanceName') IS NULL SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{InstanceName}','')
2693 IF @@SERVICENAME IS NULL SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{ServiceName}','')
2694 IF @Description IS NULL SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{Description}','')
2695 IF @NumberOfFiles = 1 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{FileNumber}','')
2696
2697 WHILE (@Updated = 1 OR @Updated IS NULL)
2698 BEGIN
2699 SET @Updated = 0
2700
2701 IF CHARINDEX('__',@CurrentDatabaseFileName) > 0
2702 BEGIN
2703 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'__','_')
2704 SET @Updated = 1
2705 END
2706
2707 IF CHARINDEX('--',@CurrentDatabaseFileName) > 0
2708 BEGIN
2709 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'--','-')
2710 SET @Updated = 1
2711 END
2712
2713 IF CHARINDEX('_$',@CurrentDatabaseFileName) > 0
2714 BEGIN
2715 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'_$','_')
2716 SET @Updated = 1
2717 END
2718 IF CHARINDEX('$_',@CurrentDatabaseFileName) > 0
2719 BEGIN
2720 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'$_','_')
2721 SET @Updated = 1
2722 END
2723
2724 IF CHARINDEX('-$',@CurrentDatabaseFileName) > 0
2725 BEGIN
2726 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'-$','-')
2727 SET @Updated = 1
2728 END
2729 IF CHARINDEX('$-',@CurrentDatabaseFileName) > 0
2730 BEGIN
2731 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'$-','-')
2732 SET @Updated = 1
2733 END
2734
2735 IF CHARINDEX('_.',@CurrentDatabaseFileName) > 0
2736 BEGIN
2737 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'_.','.')
2738 SET @Updated = 1
2739 END
2740
2741 IF CHARINDEX('-.',@CurrentDatabaseFileName) > 0
2742 BEGIN
2743 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'-.','.')
2744 SET @Updated = 1
2745 END
2746
2747 IF LEFT(@CurrentDatabaseFileName,1) = '_'
2748 BEGIN
2749 SET @CurrentDatabaseFileName = RIGHT(@CurrentDatabaseFileName,LEN(@CurrentDatabaseFileName) - 1)
2750 SET @Updated = 1
2751 END
2752 IF RIGHT(@CurrentDatabaseFileName,1) = '_'
2753 BEGIN
2754 SET @CurrentDatabaseFileName = LEFT(@CurrentDatabaseFileName,LEN(@CurrentDatabaseFileName) - 1)
2755 SET @Updated = 1
2756 END
2757
2758 IF LEFT(@CurrentDatabaseFileName,1) = '-'
2759 BEGIN
2760 SET @CurrentDatabaseFileName = RIGHT(@CurrentDatabaseFileName,LEN(@CurrentDatabaseFileName) - 1)
2761 SET @Updated = 1
2762 END
2763 IF RIGHT(@CurrentDatabaseFileName,1) = '-'
2764 BEGIN
2765 SET @CurrentDatabaseFileName = LEFT(@CurrentDatabaseFileName,LEN(@CurrentDatabaseFileName) - 1)
2766 SET @Updated = 1
2767 END
2768
2769 IF LEFT(@CurrentDatabaseFileName,1) = '$'
2770 BEGIN
2771 SET @CurrentDatabaseFileName = RIGHT(@CurrentDatabaseFileName,LEN(@CurrentDatabaseFileName) - 1)
2772 SET @Updated = 1
2773 END
2774 IF RIGHT(@CurrentDatabaseFileName,1) = '$'
2775 BEGIN
2776 SET @CurrentDatabaseFileName = LEFT(@CurrentDatabaseFileName,LEN(@CurrentDatabaseFileName) - 1)
2777 SET @Updated = 1
2778 END
2779 END
2780
2781 SET @Updated = NULL
2782
2783 SELECT @CurrentFileExtension = CASE
2784 WHEN @CurrentBackupType = 'FULL' THEN @FileExtensionFull
2785 WHEN @CurrentBackupType = 'DIFF' THEN @FileExtensionDiff
2786 WHEN @CurrentBackupType = 'LOG' THEN @FileExtensionLog
2787 END
2788
2789 -- File name - replace tokens with real values
2790 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{ServerName}',CASE WHEN SERVERPROPERTY('EngineEdition') = 8 THEN LEFT(CAST(SERVERPROPERTY('ServerName') AS nvarchar(max)),CHARINDEX('.',CAST(SERVERPROPERTY('ServerName') AS nvarchar(max))) - 1) ELSE CAST(SERVERPROPERTY('MachineName') AS nvarchar(max)) END)
2791 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{InstanceName}',ISNULL(CAST(SERVERPROPERTY('InstanceName') AS nvarchar(max)),''))
2792 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{ServiceName}',ISNULL(@@SERVICENAME,''))
2793 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{ClusterName}',ISNULL(@Cluster,''))
2794 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{AvailabilityGroupName}',ISNULL(@CurrentAvailabilityGroup,''))
2795 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{BackupType}',@CurrentBackupType)
2796 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{Partial}','PARTIAL')
2797 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{CopyOnly}','COPY_ONLY')
2798 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{Description}',LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(ISNULL(@Description,''),'\',''),'/',''),':',''),'*',''),'?',''),'"',''),'<',''),'>',''),'|',''))))
2799 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{Year}',CAST(DATEPART(YEAR,@CurrentDate) AS nvarchar))
2800 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{Month}',RIGHT('0' + CAST(DATEPART(MONTH,@CurrentDate) AS nvarchar),2))
2801 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{Day}',RIGHT('0' + CAST(DATEPART(DAY,@CurrentDate) AS nvarchar),2))
2802 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{Hour}',RIGHT('0' + CAST(DATEPART(HOUR,@CurrentDate) AS nvarchar),2))
2803 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{Minute}',RIGHT('0' + CAST(DATEPART(MINUTE,@CurrentDate) AS nvarchar),2))
2804 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{Second}',RIGHT('0' + CAST(DATEPART(SECOND,@CurrentDate) AS nvarchar),2))
2805 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{Millisecond}',RIGHT('00' + CAST(DATEPART(MILLISECOND,@CurrentDate) AS nvarchar),3))
2806 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{FileExtension}',@CurrentFileExtension)
2807 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{MajorVersion}',ISNULL(CAST(SERVERPROPERTY('ProductMajorVersion') AS nvarchar),PARSENAME(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar),4)))
2808 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{MinorVersion}',ISNULL(CAST(SERVERPROPERTY('ProductMinorVersion') AS nvarchar),PARSENAME(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar),3)))
2809
2810 SELECT @CurrentMaxFilePathLength = CASE
2811 WHEN EXISTS (SELECT * FROM @CurrentDirectories) THEN (SELECT MAX(LEN(DirectoryPath + @DirectorySeparator)) FROM @CurrentDirectories)
2812 WHEN EXISTS (SELECT * FROM @CurrentURLs) THEN (SELECT MAX(LEN(DirectoryPath + @DirectorySeparator)) FROM @CurrentURLs)
2813 END
2814 + LEN(REPLACE(REPLACE(@CurrentDatabaseFileName,'{DatabaseName}',@CurrentDatabaseNameFS), '{FileNumber}', CASE WHEN @NumberOfFiles > 1 AND @NumberOfFiles <= 9 THEN '1' WHEN @NumberOfFiles >= 10 THEN '01' ELSE '' END))
2815
2816 -- The maximum length of a backup device is 259 characters
2817 IF @CurrentMaxFilePathLength > 259
2818 BEGIN
2819 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{DatabaseName}',LEFT(@CurrentDatabaseNameFS,CASE WHEN (LEN(@CurrentDatabaseNameFS) + 259 - @CurrentMaxFilePathLength - 3) < 20 THEN 20 ELSE (LEN(@CurrentDatabaseNameFS) + 259 - @CurrentMaxFilePathLength - 3) END) + '...')
2820 END
2821 ELSE
2822 BEGIN
2823 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{DatabaseName}',@CurrentDatabaseNameFS)
2824 END
2825
2826 IF EXISTS (SELECT * FROM @CurrentDirectories WHERE Mirror = 0)
2827 BEGIN
2828 SET @CurrentFileNumber = 0
2829
2830 WHILE @CurrentFileNumber < @NumberOfFiles
2831 BEGIN
2832 SET @CurrentFileNumber = @CurrentFileNumber + 1
2833
2834 SELECT @CurrentDirectoryPath = DirectoryPath
2835 FROM @CurrentDirectories
2836 WHERE @CurrentFileNumber >= (DirectoryNumber - 1) * (SELECT @NumberOfFiles / COUNT(*) FROM @CurrentDirectories WHERE Mirror = 0) + 1
2837 AND @CurrentFileNumber <= DirectoryNumber * (SELECT @NumberOfFiles / COUNT(*) FROM @CurrentDirectories WHERE Mirror = 0)
2838 AND Mirror = 0
2839
2840 SET @CurrentFileName = REPLACE(@CurrentDatabaseFileName, '{FileNumber}', CASE WHEN @NumberOfFiles > 1 AND @NumberOfFiles <= 9 THEN CAST(@CurrentFileNumber AS nvarchar) WHEN @NumberOfFiles >= 10 THEN RIGHT('0' + CAST(@CurrentFileNumber AS nvarchar),2) ELSE '' END)
2841
2842 SET @CurrentFilePath = @CurrentDirectoryPath + @DirectorySeparator + @CurrentFileName
2843
2844 INSERT INTO @CurrentFiles ([Type], FilePath, Mirror)
2845 SELECT 'DISK', @CurrentFilePath, 0
2846
2847 SET @CurrentDirectoryPath = NULL
2848 SET @CurrentFileName = NULL
2849 SET @CurrentFilePath = NULL
2850 END
2851
2852 INSERT INTO @CurrentBackupSet (Mirror, VerifyCompleted)
2853 SELECT 0, 0
2854 END
2855
2856 IF EXISTS (SELECT * FROM @CurrentDirectories WHERE Mirror = 1)
2857 BEGIN
2858 SET @CurrentFileNumber = 0
2859
2860 WHILE @CurrentFileNumber < @NumberOfFiles
2861 BEGIN
2862 SET @CurrentFileNumber = @CurrentFileNumber + 1
2863
2864 SELECT @CurrentDirectoryPath = DirectoryPath
2865 FROM @CurrentDirectories
2866 WHERE @CurrentFileNumber >= (DirectoryNumber - 1) * (SELECT @NumberOfFiles / COUNT(*) FROM @CurrentDirectories WHERE Mirror = 1) + 1
2867 AND @CurrentFileNumber <= DirectoryNumber * (SELECT @NumberOfFiles / COUNT(*) FROM @CurrentDirectories WHERE Mirror = 1)
2868 AND Mirror = 1
2869
2870 SET @CurrentFileName = REPLACE(@CurrentDatabaseFileName, '{FileNumber}', CASE WHEN @NumberOfFiles > 1 AND @NumberOfFiles <= 9 THEN CAST(@CurrentFileNumber AS nvarchar) WHEN @NumberOfFiles >= 10 THEN RIGHT('0' + CAST(@CurrentFileNumber AS nvarchar),2) ELSE '' END)
2871
2872 SET @CurrentFilePath = @CurrentDirectoryPath + @DirectorySeparator + @CurrentFileName
2873
2874 INSERT INTO @CurrentFiles ([Type], FilePath, Mirror)
2875 SELECT 'DISK', @CurrentFilePath, 1
2876
2877 SET @CurrentDirectoryPath = NULL
2878 SET @CurrentFileName = NULL
2879 SET @CurrentFilePath = NULL
2880 END
2881
2882 INSERT INTO @CurrentBackupSet (Mirror, VerifyCompleted)
2883 SELECT 1, 0
2884 END
2885
2886 IF EXISTS (SELECT * FROM @CurrentURLs WHERE Mirror = 0)
2887 BEGIN
2888 SET @CurrentFileNumber = 0
2889
2890 WHILE @CurrentFileNumber < @NumberOfFiles
2891 BEGIN
2892 SET @CurrentFileNumber = @CurrentFileNumber + 1
2893
2894 SELECT @CurrentDirectoryPath = DirectoryPath
2895 FROM @CurrentURLs
2896 WHERE @CurrentFileNumber >= (DirectoryNumber - 1) * (SELECT @NumberOfFiles / COUNT(*) FROM @CurrentURLs WHERE Mirror = 0) + 1
2897 AND @CurrentFileNumber <= DirectoryNumber * (SELECT @NumberOfFiles / COUNT(*) FROM @CurrentURLs WHERE Mirror = 0)
2898 AND Mirror = 0
2899
2900 SET @CurrentFileName = REPLACE(@CurrentDatabaseFileName, '{FileNumber}', CASE WHEN @NumberOfFiles > 1 AND @NumberOfFiles <= 9 THEN CAST(@CurrentFileNumber AS nvarchar) WHEN @NumberOfFiles >= 10 THEN RIGHT('0' + CAST(@CurrentFileNumber AS nvarchar),2) ELSE '' END)
2901
2902 SET @CurrentFilePath = @CurrentDirectoryPath + @DirectorySeparator + @CurrentFileName
2903
2904 INSERT INTO @CurrentFiles ([Type], FilePath, Mirror)
2905 SELECT 'URL', @CurrentFilePath, 0
2906
2907 SET @CurrentDirectoryPath = NULL
2908 SET @CurrentFileName = NULL
2909 SET @CurrentFilePath = NULL
2910 END
2911
2912 INSERT INTO @CurrentBackupSet (Mirror, VerifyCompleted)
2913 SELECT 0, 0
2914 END
2915
2916 IF EXISTS (SELECT * FROM @CurrentURLs WHERE Mirror = 1)
2917 BEGIN
2918 SET @CurrentFileNumber = 0
2919
2920 WHILE @CurrentFileNumber < @NumberOfFiles
2921 BEGIN
2922 SET @CurrentFileNumber = @CurrentFileNumber + 1
2923
2924 SELECT @CurrentDirectoryPath = DirectoryPath
2925 FROM @CurrentURLs
2926 WHERE @CurrentFileNumber >= (DirectoryNumber - 1) * (SELECT @NumberOfFiles / COUNT(*) FROM @CurrentURLs WHERE Mirror = 0) + 1
2927 AND @CurrentFileNumber <= DirectoryNumber * (SELECT @NumberOfFiles / COUNT(*) FROM @CurrentURLs WHERE Mirror = 0)
2928 AND Mirror = 1
2929
2930 SET @CurrentFileName = REPLACE(@CurrentDatabaseFileName, '{FileNumber}', CASE WHEN @NumberOfFiles > 1 AND @NumberOfFiles <= 9 THEN CAST(@CurrentFileNumber AS nvarchar) WHEN @NumberOfFiles >= 10 THEN RIGHT('0' + CAST(@CurrentFileNumber AS nvarchar),2) ELSE '' END)
2931
2932 SET @CurrentFilePath = @CurrentDirectoryPath + @DirectorySeparator + @CurrentFileName
2933
2934 INSERT INTO @CurrentFiles ([Type], FilePath, Mirror)
2935 SELECT 'URL', @CurrentFilePath, 1
2936
2937 SET @CurrentDirectoryPath = NULL
2938 SET @CurrentFileName = NULL
2939 SET @CurrentFilePath = NULL
2940 END
2941
2942 INSERT INTO @CurrentBackupSet (Mirror, VerifyCompleted)
2943 SELECT 1, 0
2944 END
2945
2946 -- Create directory
2947 IF @HostPlatform = 'Windows'
2948 AND (@BackupSoftware <> 'DATA_DOMAIN_BOOST' OR @BackupSoftware IS NULL)
2949 BEGIN
2950 WHILE (1 = 1)
2951 BEGIN
2952 SELECT TOP 1 @CurrentDirectoryID = ID,
2953 @CurrentDirectoryPath = DirectoryPath
2954 FROM @CurrentDirectories
2955 WHERE CreateCompleted = 0
2956 ORDER BY ID ASC
2957
2958 IF @@ROWCOUNT = 0
2959 BEGIN
2960 BREAK
2961 END
2962
2963 SET @CurrentCommandType01 = 'xp_create_subdir'
2964 SET @CurrentCommand01 = 'DECLARE @ReturnCode int EXECUTE @ReturnCode = [master].dbo.xp_create_subdir N''' + REPLACE(@CurrentDirectoryPath,'''','''''') + ''' IF @ReturnCode <> 0 RAISERROR(''Error creating directory.'', 16, 1)'
2965 EXECUTE @CurrentCommandOutput01 = [dbo].[CommandExecute] @Command = @CurrentCommand01, @CommandType = @CurrentCommandType01, @Mode = 1, @DatabaseName = @CurrentDatabaseName, @LogToTable = @LogToTable, @Execute = @Execute
2966 SET @Error = @@ERROR
2967 IF @Error <> 0 SET @CurrentCommandOutput01 = @Error
2968 IF @CurrentCommandOutput01 <> 0 SET @ReturnCode = @CurrentCommandOutput01
2969
2970 UPDATE @CurrentDirectories
2971 SET CreateCompleted = 1,
2972 CreateOutput = @CurrentCommandOutput01
2973 WHERE ID = @CurrentDirectoryID
2974
2975 SET @CurrentDirectoryID = NULL
2976 SET @CurrentDirectoryPath = NULL
2977
2978 SET @CurrentCommand01 = NULL
2979
2980 SET @CurrentCommandOutput01 = NULL
2981
2982 SET @CurrentCommandType01 = NULL
2983 END
2984 END
2985
2986 IF @CleanupMode = 'BEFORE_BACKUP'
2987 BEGIN
2988 INSERT INTO @CurrentCleanupDates (CleanupDate, Mirror)
2989 SELECT DATEADD(hh,-(@CleanupTime),GETDATE()), 0
2990
2991 IF NOT EXISTS(SELECT * FROM @CurrentCleanupDates WHERE (Mirror = 0 OR Mirror IS NULL) AND CleanupDate IS NULL)
2992 BEGIN
2993 UPDATE @CurrentDirectories
2994 SET CleanupDate = (SELECT MIN(CleanupDate)
2995 FROM @CurrentCleanupDates
2996 WHERE (Mirror = 0 OR Mirror IS NULL)),
2997 CleanupMode = 'BEFORE_BACKUP'
2998 WHERE Mirror = 0
2999 END
3000 END
3001
3002 IF @MirrorCleanupMode = 'BEFORE_BACKUP'
3003 BEGIN
3004 INSERT INTO @CurrentCleanupDates (CleanupDate, Mirror)
3005 SELECT DATEADD(hh,-(@MirrorCleanupTime),GETDATE()), 1
3006
3007 IF NOT EXISTS(SELECT * FROM @CurrentCleanupDates WHERE (Mirror = 1 OR Mirror IS NULL) AND CleanupDate IS NULL)
3008 BEGIN
3009 UPDATE @CurrentDirectories
3010 SET CleanupDate = (SELECT MIN(CleanupDate)
3011 FROM @CurrentCleanupDates
3012 WHERE (Mirror = 1 OR Mirror IS NULL)),
3013 CleanupMode = 'BEFORE_BACKUP'
3014 WHERE Mirror = 1
3015 END
3016 END
3017
3018 -- Delete old backup files, before backup
3019 IF NOT EXISTS (SELECT * FROM @CurrentDirectories WHERE CreateOutput <> 0 OR CreateOutput IS NULL)
3020 AND @HostPlatform = 'Windows'
3021 AND (@BackupSoftware <> 'DATA_DOMAIN_BOOST' OR @BackupSoftware IS NULL)
3022 AND @CurrentBackupType = @BackupType
3023 BEGIN
3024 WHILE (1 = 1)
3025 BEGIN
3026 SELECT TOP 1 @CurrentDirectoryID = ID,
3027 @CurrentDirectoryPath = DirectoryPath,
3028 @CurrentCleanupDate = CleanupDate
3029 FROM @CurrentDirectories
3030 WHERE CleanupDate IS NOT NULL
3031 AND CleanupMode = 'BEFORE_BACKUP'
3032 AND CleanupCompleted = 0
3033 ORDER BY ID ASC
3034
3035 IF @@ROWCOUNT = 0
3036 BEGIN
3037 BREAK
3038 END
3039
3040 IF @BackupSoftware IS NULL
3041 BEGIN
3042 SET @CurrentCommandType02 = 'xp_delete_file'
3043
3044 SET @CurrentCommand02 = 'DECLARE @ReturnCode int EXECUTE @ReturnCode = [master].dbo.xp_delete_file 0, N''' + REPLACE(@CurrentDirectoryPath,'''','''''') + ''', ''' + @CurrentFileExtension + ''', ''' + CONVERT(nvarchar(19),@CurrentCleanupDate,126) + ''' IF @ReturnCode <> 0 RAISERROR(''Error deleting files.'', 16, 1)'
3045 END
3046
3047 IF @BackupSoftware = 'LITESPEED'
3048 BEGIN
3049 SET @CurrentCommandType02 = 'xp_slssqlmaint'
3050
3051 SET @CurrentCommand02 = 'DECLARE @ReturnCode int EXECUTE @ReturnCode = [master].dbo.xp_slssqlmaint N''-MAINTDEL -DELFOLDER "' + REPLACE(@CurrentDirectoryPath,'''','''''') + '" -DELEXTENSION "' + @CurrentFileExtension + '" -DELUNIT "' + CAST(DATEDIFF(mi,@CurrentCleanupDate,GETDATE()) + 1 AS nvarchar) + '" -DELUNITTYPE "minutes" -DELUSEAGE'' IF @ReturnCode <> 0 RAISERROR(''Error deleting LiteSpeed backup files.'', 16, 1)'
3052 END
3053
3054 IF @BackupSoftware = 'SQLBACKUP'
3055 BEGIN
3056 SET @CurrentCommandType02 = 'sqbutility'
3057
3058 SET @CurrentCommand02 = 'DECLARE @ReturnCode int EXECUTE @ReturnCode = [master].dbo.sqbutility 1032, N''' + REPLACE(@CurrentDatabaseName,'''','''''') + ''', N''' + REPLACE(@CurrentDirectoryPath,'''','''''') + ''', ''' + CASE WHEN @CurrentBackupType = 'FULL' THEN 'D' WHEN @CurrentBackupType = 'DIFF' THEN 'I' WHEN @CurrentBackupType = 'LOG' THEN 'L' END + ''', ''' + CAST(DATEDIFF(hh,@CurrentCleanupDate,GETDATE()) + 1 AS nvarchar) + 'h'', ' + ISNULL('''' + REPLACE(@EncryptionKey,'''','''''') + '''','NULL') + ' IF @ReturnCode <> 0 RAISERROR(''Error deleting SQLBackup backup files.'', 16, 1)'
3059 END
3060
3061 IF @BackupSoftware = 'SQLSAFE'
3062 BEGIN
3063 SET @CurrentCommandType02 = 'xp_ss_delete'
3064
3065 SET @CurrentCommand02 = 'DECLARE @ReturnCode int EXECUTE @ReturnCode = [master].dbo.xp_ss_delete @filename = N''' + REPLACE(@CurrentDirectoryPath,'''','''''') + '\*.' + @CurrentFileExtension + ''', @age = ''' + CAST(DATEDIFF(mi,@CurrentCleanupDate,GETDATE()) + 1 AS nvarchar) + 'Minutes'' IF @ReturnCode <> 0 RAISERROR(''Error deleting SQLsafe backup files.'', 16, 1)'
3066 END
3067
3068 EXECUTE @CurrentCommandOutput02 = [dbo].[CommandExecute] @Command = @CurrentCommand02, @CommandType = @CurrentCommandType02, @Mode = 1, @DatabaseName = @CurrentDatabaseName, @LogToTable = @LogToTable, @Execute = @Execute
3069 SET @Error = @@ERROR
3070 IF @Error <> 0 SET @CurrentCommandOutput02 = @Error
3071 IF @CurrentCommandOutput02 <> 0 SET @ReturnCode = @CurrentCommandOutput02
3072
3073 UPDATE @CurrentDirectories
3074 SET CleanupCompleted = 1,
3075 CleanupOutput = @CurrentCommandOutput02
3076 WHERE ID = @CurrentDirectoryID
3077
3078 SET @CurrentDirectoryID = NULL
3079 SET @CurrentDirectoryPath = NULL
3080 SET @CurrentCleanupDate = NULL
3081
3082 SET @CurrentCommand02 = NULL
3083
3084 SET @CurrentCommandOutput02 = NULL
3085
3086 SET @CurrentCommandType02 = NULL
3087 END
3088 END
3089
3090 -- Perform a backup
3091 IF NOT EXISTS (SELECT * FROM @CurrentDirectories WHERE CreateOutput <> 0 OR CreateOutput IS NULL) OR @HostPlatform = 'Linux'
3092 BEGIN
3093 IF @BackupSoftware IS NULL
3094 BEGIN
3095 SELECT @CurrentCommandType03 = CASE
3096 WHEN @CurrentBackupType IN('DIFF','FULL') THEN 'BACKUP_DATABASE'
3097 WHEN @CurrentBackupType = 'LOG' THEN 'BACKUP_LOG'
3098 END
3099
3100 SELECT @CurrentCommand03 = CASE
3101 WHEN @CurrentBackupType IN('DIFF','FULL') THEN 'BACKUP DATABASE ' + QUOTENAME(@CurrentDatabaseName)
3102 WHEN @CurrentBackupType = 'LOG' THEN 'BACKUP LOG ' + QUOTENAME(@CurrentDatabaseName)
3103 END
3104
3105 IF @ReadWriteFileGroups = 'Y' AND @CurrentDatabaseName <> 'master' SET @CurrentCommand03 = @CurrentCommand03 + ' READ_WRITE_FILEGROUPS'
3106
3107 SET @CurrentCommand03 = @CurrentCommand03 + ' TO'
3108
3109 SELECT @CurrentCommand03 = @CurrentCommand03 + ' ' + [Type] + ' = N''' + REPLACE(FilePath,'''','''''') + '''' + CASE WHEN ROW_NUMBER() OVER (ORDER BY FilePath ASC) <> @NumberOfFiles THEN ',' ELSE '' END
3110 FROM @CurrentFiles
3111 WHERE Mirror = 0
3112 ORDER BY FilePath ASC
3113
3114 IF EXISTS(SELECT * FROM @CurrentFiles WHERE Mirror = 1)
3115 BEGIN
3116 SET @CurrentCommand03 = @CurrentCommand03 + ' MIRROR TO'
3117
3118 SELECT @CurrentCommand03 = @CurrentCommand03 + ' ' + [Type] + ' = N''' + REPLACE(FilePath,'''','''''') + '''' + CASE WHEN ROW_NUMBER() OVER (ORDER BY FilePath ASC) <> @NumberOfFiles THEN ',' ELSE '' END
3119 FROM @CurrentFiles
3120 WHERE Mirror = 1
3121 ORDER BY FilePath ASC
3122 END
3123
3124 SET @CurrentCommand03 = @CurrentCommand03 + ' WITH '
3125 IF @CheckSum = 'Y' SET @CurrentCommand03 = @CurrentCommand03 + 'CHECKSUM'
3126 IF @CheckSum = 'N' SET @CurrentCommand03 = @CurrentCommand03 + 'NO_CHECKSUM'
3127
3128 IF @Version >= 10
3129 BEGIN
3130 SET @CurrentCommand03 = @CurrentCommand03 + CASE WHEN @Compress = 'Y' AND (@CurrentIsEncrypted = 0 OR (@CurrentIsEncrypted = 1 AND @Version >= 13 AND @MaxTransferSize > 65536)) THEN ', COMPRESSION' ELSE ', NO_COMPRESSION' END
3131 END
3132
3133 IF @CurrentBackupType = 'DIFF' SET @CurrentCommand03 = @CurrentCommand03 + ', DIFFERENTIAL'
3134
3135 IF EXISTS(SELECT * FROM @CurrentFiles WHERE Mirror = 1)
3136 BEGIN
3137 SET @CurrentCommand03 = @CurrentCommand03 + ', FORMAT'
3138 END
3139
3140 IF @CopyOnly = 'Y' SET @CurrentCommand03 = @CurrentCommand03 + ', COPY_ONLY'
3141 IF @NoRecovery = 'Y' AND @CurrentBackupType = 'LOG' SET @CurrentCommand03 = @CurrentCommand03 + ', NORECOVERY'
3142 IF @Init = 'Y' SET @CurrentCommand03 = @CurrentCommand03 + ', INIT'
3143 IF @BlockSize IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', BLOCKSIZE = ' + CAST(@BlockSize AS nvarchar)
3144 IF @BufferCount IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', BUFFERCOUNT = ' + CAST(@BufferCount AS nvarchar)
3145 IF @MaxTransferSize IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', MAXTRANSFERSIZE = ' + CAST(@MaxTransferSize AS nvarchar)
3146 IF @Description IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', DESCRIPTION = N''' + REPLACE(@Description,'''','''''') + ''''
3147 IF @Encrypt = 'Y' SET @CurrentCommand03 = @CurrentCommand03 + ', ENCRYPTION (ALGORITHM = ' + UPPER(@EncryptionAlgorithm) + ', '
3148 IF @Encrypt = 'Y' AND @ServerCertificate IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + 'SERVER CERTIFICATE = ' + QUOTENAME(@ServerCertificate)
3149 IF @Encrypt = 'Y' AND @ServerAsymmetricKey IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + 'SERVER ASYMMETRIC KEY = ' + QUOTENAME(@ServerAsymmetricKey)
3150 IF @Encrypt = 'Y' SET @CurrentCommand03 = @CurrentCommand03 + ')'
3151 IF @URL IS NOT NULL AND @Credential IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', CREDENTIAL = N''' + REPLACE(@Credential,'''','''''') + ''''
3152 END
3153
3154 IF @BackupSoftware = 'LITESPEED'
3155 BEGIN
3156 SELECT @CurrentCommandType03 = CASE
3157 WHEN @CurrentBackupType IN('DIFF','FULL') THEN 'xp_backup_database'
3158 WHEN @CurrentBackupType = 'LOG' THEN 'xp_backup_log'
3159 END
3160
3161 SELECT @CurrentCommand03 = CASE
3162 WHEN @CurrentBackupType IN('DIFF','FULL') THEN 'DECLARE @ReturnCode int EXECUTE @ReturnCode = [master].dbo.xp_backup_database @database = N''' + REPLACE(@CurrentDatabaseName,'''','''''') + ''''
3163 WHEN @CurrentBackupType = 'LOG' THEN 'DECLARE @ReturnCode int EXECUTE @ReturnCode = [master].dbo.xp_backup_log @database = N''' + REPLACE(@CurrentDatabaseName,'''','''''') + ''''
3164 END
3165
3166 SELECT @CurrentCommand03 = @CurrentCommand03 + ', @filename = N''' + REPLACE(FilePath,'''','''''') + ''''
3167 FROM @CurrentFiles
3168 WHERE Mirror = 0
3169 ORDER BY FilePath ASC
3170
3171 IF EXISTS(SELECT * FROM @CurrentFiles WHERE Mirror = 1)
3172 BEGIN
3173 SELECT @CurrentCommand03 = @CurrentCommand03 + ', @mirror = N''' + REPLACE(FilePath,'''','''''') + ''''
3174 FROM @CurrentFiles
3175 WHERE Mirror = 1
3176 ORDER BY FilePath ASC
3177 END
3178
3179 SET @CurrentCommand03 = @CurrentCommand03 + ', @with = '''
3180 IF @CheckSum = 'Y' SET @CurrentCommand03 = @CurrentCommand03 + 'CHECKSUM'
3181 IF @CheckSum = 'N' SET @CurrentCommand03 = @CurrentCommand03 + 'NO_CHECKSUM'
3182 IF @CurrentBackupType = 'DIFF' SET @CurrentCommand03 = @CurrentCommand03 + ', DIFFERENTIAL'
3183 IF @CopyOnly = 'Y' SET @CurrentCommand03 = @CurrentCommand03 + ', COPY_ONLY'
3184 IF @NoRecovery = 'Y' AND @CurrentBackupType = 'LOG' SET @CurrentCommand03 = @CurrentCommand03 + ', NORECOVERY'
3185 IF @BlockSize IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', BLOCKSIZE = ' + CAST(@BlockSize AS nvarchar)
3186 SET @CurrentCommand03 = @CurrentCommand03 + ''''
3187 IF @ReadWriteFileGroups = 'Y' AND @CurrentDatabaseName <> 'master' SET @CurrentCommand03 = @CurrentCommand03 + ', @read_write_filegroups = 1'
3188 IF @CompressionLevel IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', @compressionlevel = ' + CAST(@CompressionLevel AS nvarchar)
3189 IF @AdaptiveCompression IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', @adaptivecompression = ''' + CASE WHEN @AdaptiveCompression = 'SIZE' THEN 'Size' WHEN @AdaptiveCompression = 'SPEED' THEN 'Speed' END + ''''
3190 IF @BufferCount IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', @buffercount = ' + CAST(@BufferCount AS nvarchar)
3191 IF @MaxTransferSize IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', @maxtransfersize = ' + CAST(@MaxTransferSize AS nvarchar)
3192 IF @Threads IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', @threads = ' + CAST(@Threads AS nvarchar)
3193 IF @Init = 'Y' SET @CurrentCommand03 = @CurrentCommand03 + ', @init = 1'
3194 IF @Throttle IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', @throttle = ' + CAST(@Throttle AS nvarchar)
3195 IF @Description IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', @desc = N''' + REPLACE(@Description,'''','''''') + ''''
3196
3197 IF @EncryptionAlgorithm IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', @cryptlevel = ' + CASE
3198 WHEN @EncryptionAlgorithm = 'RC2_40' THEN '0'
3199 WHEN @EncryptionAlgorithm = 'RC2_56' THEN '1'
3200 WHEN @EncryptionAlgorithm = 'RC2_112' THEN '2'
3201 WHEN @EncryptionAlgorithm = 'RC2_128' THEN '3'
3202 WHEN @EncryptionAlgorithm = 'TRIPLE_DES_3KEY' THEN '4'
3203 WHEN @EncryptionAlgorithm = 'RC4_128' THEN '5'
3204 WHEN @EncryptionAlgorithm = 'AES_128' THEN '6'
3205 WHEN @EncryptionAlgorithm = 'AES_192' THEN '7'
3206 WHEN @EncryptionAlgorithm = 'AES_256' THEN '8'
3207 END
3208
3209 IF @EncryptionKey IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', @encryptionkey = N''' + REPLACE(@EncryptionKey,'''','''''') + ''''
3210 SET @CurrentCommand03 = @CurrentCommand03 + ' IF @ReturnCode <> 0 RAISERROR(''Error performing LiteSpeed backup.'', 16, 1)'
3211 END
3212
3213 IF @BackupSoftware = 'SQLBACKUP'
3214 BEGIN
3215 SET @CurrentCommandType03 = 'sqlbackup'
3216
3217 SELECT @CurrentCommand03 = CASE
3218 WHEN @CurrentBackupType IN('DIFF','FULL') THEN 'BACKUP DATABASE ' + QUOTENAME(@CurrentDatabaseName)
3219 WHEN @CurrentBackupType = 'LOG' THEN 'BACKUP LOG ' + QUOTENAME(@CurrentDatabaseName)
3220 END
3221
3222 IF @ReadWriteFileGroups = 'Y' AND @CurrentDatabaseName <> 'master' SET @CurrentCommand03 = @CurrentCommand03 + ' READ_WRITE_FILEGROUPS'
3223
3224 SET @CurrentCommand03 = @CurrentCommand03 + ' TO'
3225
3226 SELECT @CurrentCommand03 = @CurrentCommand03 + ' DISK = N''' + REPLACE(FilePath,'''','''''') + '''' + CASE WHEN ROW_NUMBER() OVER (ORDER BY FilePath ASC) <> @NumberOfFiles THEN ',' ELSE '' END
3227 FROM @CurrentFiles
3228 WHERE Mirror = 0
3229 ORDER BY FilePath ASC
3230
3231 SET @CurrentCommand03 = @CurrentCommand03 + ' WITH '
3232
3233 IF EXISTS(SELECT * FROM @CurrentFiles WHERE Mirror = 1)
3234 BEGIN
3235 SET @CurrentCommand03 = @CurrentCommand03 + ' MIRRORFILE' + ' = N''' + REPLACE((SELECT FilePath FROM @CurrentFiles WHERE Mirror = 1),'''','''''') + ''', '
3236 END
3237
3238 IF @CheckSum = 'Y' SET @CurrentCommand03 = @CurrentCommand03 + 'CHECKSUM'
3239 IF @CheckSum = 'N' SET @CurrentCommand03 = @CurrentCommand03 + 'NO_CHECKSUM'
3240 IF @CurrentBackupType = 'DIFF' SET @CurrentCommand03 = @CurrentCommand03 + ', DIFFERENTIAL'
3241 IF @CopyOnly = 'Y' SET @CurrentCommand03 = @CurrentCommand03 + ', COPY_ONLY'
3242 IF @NoRecovery = 'Y' AND @CurrentBackupType = 'LOG' SET @CurrentCommand03 = @CurrentCommand03 + ', NORECOVERY'
3243 IF @Init = 'Y' SET @CurrentCommand03 = @CurrentCommand03 + ', INIT'
3244 IF @CompressionLevel IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', COMPRESSION = ' + CAST(@CompressionLevel AS nvarchar)
3245 IF @Threads IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', THREADCOUNT = ' + CAST(@Threads AS nvarchar)
3246 IF @MaxTransferSize IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', MAXTRANSFERSIZE = ' + CAST(@MaxTransferSize AS nvarchar)
3247 IF @Description IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', DESCRIPTION = N''' + REPLACE(@Description,'''','''''') + ''''
3248
3249 IF @EncryptionAlgorithm IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', KEYSIZE = ' + CASE
3250 WHEN @EncryptionAlgorithm = 'AES_128' THEN '128'
3251 WHEN @EncryptionAlgorithm = 'AES_256' THEN '256'
3252 END
3253
3254 IF @EncryptionKey IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', PASSWORD = N''' + REPLACE(@EncryptionKey,'''','''''') + ''''
3255 SET @CurrentCommand03 = 'DECLARE @ReturnCode int EXECUTE @ReturnCode = [master].dbo.sqlbackup N''-SQL "' + REPLACE(@CurrentCommand03,'''','''''') + '"''' + ' IF @ReturnCode <> 0 RAISERROR(''Error performing SQLBackup backup.'', 16, 1)'
3256 END
3257
3258 IF @BackupSoftware = 'SQLSAFE'
3259 BEGIN
3260 SET @CurrentCommandType03 = 'xp_ss_backup'
3261
3262 SET @CurrentCommand03 = 'DECLARE @ReturnCode int EXECUTE @ReturnCode = [master].dbo.xp_ss_backup @database = N''' + REPLACE(@CurrentDatabaseName,'''','''''') + ''''
3263
3264 SELECT @CurrentCommand03 = @CurrentCommand03 + ', ' + CASE WHEN ROW_NUMBER() OVER (ORDER BY FilePath ASC) = 1 THEN '@filename' ELSE '@backupfile' END + ' = N''' + REPLACE(FilePath,'''','''''') + ''''
3265 FROM @CurrentFiles
3266 WHERE Mirror = 0
3267 ORDER BY FilePath ASC
3268
3269 SELECT @CurrentCommand03 = @CurrentCommand03 + ', @mirrorfile = N''' + REPLACE(FilePath,'''','''''') + ''''
3270 FROM @CurrentFiles
3271 WHERE Mirror = 1
3272 ORDER BY FilePath ASC
3273
3274 SET @CurrentCommand03 = @CurrentCommand03 + ', @backuptype = ' + CASE WHEN @CurrentBackupType = 'FULL' THEN '''Full''' WHEN @CurrentBackupType = 'DIFF' THEN '''Differential''' WHEN @CurrentBackupType = 'LOG' THEN '''Log''' END
3275 IF @ReadWriteFileGroups = 'Y' AND @CurrentDatabaseName <> 'master' SET @CurrentCommand03 = @CurrentCommand03 + ', @readwritefilegroups = 1'
3276 SET @CurrentCommand03 = @CurrentCommand03 + ', @checksum = ' + CASE WHEN @CheckSum = 'Y' THEN '1' WHEN @CheckSum = 'N' THEN '0' END
3277 SET @CurrentCommand03 = @CurrentCommand03 + ', @copyonly = ' + CASE WHEN @CopyOnly = 'Y' THEN '1' WHEN @CopyOnly = 'N' THEN '0' END
3278 IF @CompressionLevel IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', @compressionlevel = ' + CAST(@CompressionLevel AS nvarchar)
3279 IF @Threads IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', @threads = ' + CAST(@Threads AS nvarchar)
3280 IF @Init = 'Y' SET @CurrentCommand03 = @CurrentCommand03 + ', @overwrite = 1'
3281 IF @Description IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', @desc = N''' + REPLACE(@Description,'''','''''') + ''''
3282
3283 IF @EncryptionAlgorithm IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', @encryptiontype = N''' + CASE
3284 WHEN @EncryptionAlgorithm = 'AES_128' THEN 'AES128'
3285 WHEN @EncryptionAlgorithm = 'AES_256' THEN 'AES256'
3286 END + ''''
3287
3288 IF @EncryptionKey IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', @encryptedbackuppassword = N''' + REPLACE(@EncryptionKey,'''','''''') + ''''
3289 SET @CurrentCommand03 = @CurrentCommand03 + ' IF @ReturnCode <> 0 RAISERROR(''Error performing SQLsafe backup.'', 16, 1)'
3290 END
3291
3292 IF @BackupSoftware = 'DATA_DOMAIN_BOOST'
3293 BEGIN
3294 SET @CurrentCommandType03 = 'emc_run_backup'
3295
3296 SET @CurrentCommand03 = 'DECLARE @ReturnCode int EXECUTE @ReturnCode = [master].dbo.emc_run_backup '''
3297
3298 SET @CurrentCommand03 = @CurrentCommand03 + ' -c ' + CASE WHEN @CurrentAvailabilityGroup IS NOT NULL THEN @Cluster ELSE CAST(SERVERPROPERTY('MachineName') AS nvarchar) END
3299
3300 SET @CurrentCommand03 = @CurrentCommand03 + ' -l ' + CASE
3301 WHEN @CurrentBackupType = 'FULL' THEN 'full'
3302 WHEN @CurrentBackupType = 'DIFF' THEN 'diff'
3303 WHEN @CurrentBackupType = 'LOG' THEN 'incr'
3304 END
3305
3306 IF @NoRecovery = 'Y' SET @CurrentCommand03 = @CurrentCommand03 + ' -H'
3307
3308 IF @CleanupTime IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ' -y +' + CAST(@CleanupTime/24 + CASE WHEN @CleanupTime%24 > 0 THEN 1 ELSE 0 END AS nvarchar) + 'd'
3309
3310 IF @CheckSum = 'Y' SET @CurrentCommand03 = @CurrentCommand03 + ' -k'
3311
3312 SET @CurrentCommand03 = @CurrentCommand03 + ' -S ' + CAST(@NumberOfFiles AS nvarchar)
3313
3314 IF @Description IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ' -b "' + REPLACE(@Description,'''','''''') + '"'
3315
3316 IF @BufferCount IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ' -O "BUFFERCOUNT=' + CAST(@BufferCount AS nvarchar) + '"'
3317
3318 IF @ReadWriteFileGroups = 'Y' AND @CurrentDatabaseName <> 'master' SET @CurrentCommand03 = @CurrentCommand03 + ' -O "READ_WRITE_FILEGROUPS"'
3319
3320 IF @DataDomainBoostHost IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ' -a "NSR_DFA_SI_DD_HOST=' + REPLACE(@DataDomainBoostHost,'''','''''') + '"'
3321 IF @DataDomainBoostUser IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ' -a "NSR_DFA_SI_DD_USER=' + REPLACE(@DataDomainBoostUser,'''','''''') + '"'
3322 IF @DataDomainBoostDevicePath IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ' -a "NSR_DFA_SI_DEVICE_PATH=' + REPLACE(@DataDomainBoostDevicePath,'''','''''') + '"'
3323 IF @DataDomainBoostLockboxPath IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ' -a "NSR_DFA_SI_DD_LOCKBOX_PATH=' + REPLACE(@DataDomainBoostLockboxPath,'''','''''') + '"'
3324 SET @CurrentCommand03 = @CurrentCommand03 + ' -a "NSR_SKIP_NON_BACKUPABLE_STATE_DB=TRUE"'
3325 IF @CopyOnly = 'Y' SET @CurrentCommand03 = @CurrentCommand03 + ' -a "NSR_COPY_ONLY=TRUE"'
3326
3327 IF SERVERPROPERTY('InstanceName') IS NULL SET @CurrentCommand03 = @CurrentCommand03 + ' "MSSQL' + ':' + REPLACE(REPLACE(@CurrentDatabaseName,'''',''''''),'.','\.') + '"'
3328 IF SERVERPROPERTY('InstanceName') IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ' "MSSQL$' + CAST(SERVERPROPERTY('InstanceName') AS nvarchar) + ':' + REPLACE(REPLACE(@CurrentDatabaseName,'''',''''''),'.','\.') + '"'
3329
3330 SET @CurrentCommand03 = @CurrentCommand03 + ''''
3331
3332 SET @CurrentCommand03 = @CurrentCommand03 + ' IF @ReturnCode <> 0 RAISERROR(''Error performing Data Domain Boost backup.'', 16, 1)'
3333 END
3334
3335 EXECUTE @CurrentCommandOutput03 = [dbo].[CommandExecute] @Command = @CurrentCommand03, @CommandType = @CurrentCommandType03, @Mode = 1, @DatabaseName = @CurrentDatabaseName, @LogToTable = @LogToTable, @Execute = @Execute
3336 SET @Error = @@ERROR
3337 IF @Error <> 0 SET @CurrentCommandOutput03 = @Error
3338 IF @CurrentCommandOutput03 <> 0 SET @ReturnCode = @CurrentCommandOutput03
3339 END
3340
3341 -- Verify the backup
3342 IF @CurrentCommandOutput03 = 0 AND @Verify = 'Y'
3343 BEGIN
3344 WHILE (1 = 1)
3345 BEGIN
3346 SELECT TOP 1 @CurrentBackupSetID = ID,
3347 @CurrentIsMirror = Mirror
3348 FROM @CurrentBackupSet
3349 WHERE VerifyCompleted = 0
3350 ORDER BY ID ASC
3351
3352 IF @@ROWCOUNT = 0
3353 BEGIN
3354 BREAK
3355 END
3356
3357 IF @BackupSoftware IS NULL
3358 BEGIN
3359 SET @CurrentCommandType04 = 'RESTORE_VERIFYONLY'
3360
3361 SET @CurrentCommand04 = 'RESTORE VERIFYONLY FROM'
3362
3363 SELECT @CurrentCommand04 = @CurrentCommand04 + ' ' + [Type] + ' = N''' + REPLACE(FilePath,'''','''''') + '''' + CASE WHEN ROW_NUMBER() OVER (ORDER BY FilePath ASC) <> @NumberOfFiles THEN ',' ELSE '' END
3364 FROM @CurrentFiles
3365 WHERE Mirror = @CurrentIsMirror
3366 ORDER BY FilePath ASC
3367
3368 SET @CurrentCommand04 = @CurrentCommand04 + ' WITH '
3369 IF @CheckSum = 'Y' SET @CurrentCommand04 = @CurrentCommand04 + 'CHECKSUM'
3370 IF @CheckSum = 'N' SET @CurrentCommand04 = @CurrentCommand04 + 'NO_CHECKSUM'
3371 IF @URL IS NOT NULL AND @Credential IS NOT NULL SET @CurrentCommand04 = @CurrentCommand04 + ', CREDENTIAL = N''' + REPLACE(@Credential,'''','''''') + ''''
3372 END
3373
3374 IF @BackupSoftware = 'LITESPEED'
3375 BEGIN
3376 SET @CurrentCommandType04 = 'xp_restore_verifyonly'
3377
3378 SET @CurrentCommand04 = 'DECLARE @ReturnCode int EXECUTE @ReturnCode = [master].dbo.xp_restore_verifyonly'
3379
3380 SELECT @CurrentCommand04 = @CurrentCommand04 + ' @filename = N''' + REPLACE(FilePath,'''','''''') + '''' + CASE WHEN ROW_NUMBER() OVER (ORDER BY FilePath ASC) <> @NumberOfFiles THEN ',' ELSE '' END
3381 FROM @CurrentFiles
3382 WHERE Mirror = @CurrentIsMirror
3383 ORDER BY FilePath ASC
3384
3385 SET @CurrentCommand04 = @CurrentCommand04 + ', @with = '''
3386 IF @CheckSum = 'Y' SET @CurrentCommand04 = @CurrentCommand04 + 'CHECKSUM'
3387 IF @CheckSum = 'N' SET @CurrentCommand04 = @CurrentCommand04 + 'NO_CHECKSUM'
3388 SET @CurrentCommand04 = @CurrentCommand04 + ''''
3389 IF @EncryptionKey IS NOT NULL SET @CurrentCommand04 = @CurrentCommand04 + ', @encryptionkey = N''' + REPLACE(@EncryptionKey,'''','''''') + ''''
3390
3391 SET @CurrentCommand04 = @CurrentCommand04 + ' IF @ReturnCode <> 0 RAISERROR(''Error verifying LiteSpeed backup.'', 16, 1)'
3392 END
3393
3394 IF @BackupSoftware = 'SQLBACKUP'
3395 BEGIN
3396 SET @CurrentCommandType04 = 'sqlbackup'
3397
3398 SET @CurrentCommand04 = 'RESTORE VERIFYONLY FROM'
3399
3400 SELECT @CurrentCommand04 = @CurrentCommand04 + ' DISK = N''' + REPLACE(FilePath,'''','''''') + '''' + CASE WHEN ROW_NUMBER() OVER (ORDER BY FilePath ASC) <> @NumberOfFiles THEN ',' ELSE '' END
3401 FROM @CurrentFiles
3402 WHERE Mirror = @CurrentIsMirror
3403 ORDER BY FilePath ASC
3404
3405 SET @CurrentCommand04 = @CurrentCommand04 + ' WITH '
3406 IF @CheckSum = 'Y' SET @CurrentCommand04 = @CurrentCommand04 + 'CHECKSUM'
3407 IF @CheckSum = 'N' SET @CurrentCommand04 = @CurrentCommand04 + 'NO_CHECKSUM'
3408 IF @EncryptionKey IS NOT NULL SET @CurrentCommand04 = @CurrentCommand04 + ', PASSWORD = N''' + REPLACE(@EncryptionKey,'''','''''') + ''''
3409
3410 SET @CurrentCommand04 = 'DECLARE @ReturnCode int EXECUTE @ReturnCode = [master].dbo.sqlbackup N''-SQL "' + REPLACE(@CurrentCommand04,'''','''''') + '"''' + ' IF @ReturnCode <> 0 RAISERROR(''Error verifying SQLBackup backup.'', 16, 1)'
3411 END
3412
3413 IF @BackupSoftware = 'SQLSAFE'
3414 BEGIN
3415 SET @CurrentCommandType04 = 'xp_ss_verify'
3416
3417 SET @CurrentCommand04 = 'DECLARE @ReturnCode int EXECUTE @ReturnCode = [master].dbo.xp_ss_verify @database = N''' + REPLACE(@CurrentDatabaseName,'''','''''') + ''''
3418
3419 SELECT @CurrentCommand04 = @CurrentCommand04 + ', ' + CASE WHEN ROW_NUMBER() OVER (ORDER BY FilePath ASC) = 1 THEN '@filename' ELSE '@backupfile' END + ' = N''' + REPLACE(FilePath,'''','''''') + ''''
3420 FROM @CurrentFiles
3421 WHERE Mirror = @CurrentIsMirror
3422 ORDER BY FilePath ASC
3423
3424 SET @CurrentCommand04 = @CurrentCommand04 + ' IF @ReturnCode <> 0 RAISERROR(''Error verifying SQLsafe backup.'', 16, 1)'
3425 END
3426
3427 EXECUTE @CurrentCommandOutput04 = [dbo].[CommandExecute] @Command = @CurrentCommand04, @CommandType = @CurrentCommandType04, @Mode = 1, @DatabaseName = @CurrentDatabaseName, @LogToTable = @LogToTable, @Execute = @Execute
3428 SET @Error = @@ERROR
3429 IF @Error <> 0 SET @CurrentCommandOutput04 = @Error
3430 IF @CurrentCommandOutput04 <> 0 SET @ReturnCode = @CurrentCommandOutput04
3431
3432 UPDATE @CurrentBackupSet
3433 SET VerifyCompleted = 1,
3434 VerifyOutput = @CurrentCommandOutput04
3435 WHERE ID = @CurrentBackupSetID
3436
3437 SET @CurrentBackupSetID = NULL
3438 SET @CurrentIsMirror = NULL
3439
3440 SET @CurrentCommand04 = NULL
3441
3442 SET @CurrentCommandOutput04 = NULL
3443
3444 SET @CurrentCommandType04 = NULL
3445 END
3446 END
3447
3448 IF @CleanupMode = 'AFTER_BACKUP'
3449 BEGIN
3450 INSERT INTO @CurrentCleanupDates (CleanupDate, Mirror)
3451 SELECT DATEADD(hh,-(@CleanupTime),GETDATE()), 0
3452
3453 IF NOT EXISTS(SELECT * FROM @CurrentCleanupDates WHERE (Mirror = 0 OR Mirror IS NULL) AND CleanupDate IS NULL)
3454 BEGIN
3455 UPDATE @CurrentDirectories
3456 SET CleanupDate = (SELECT MIN(CleanupDate)
3457 FROM @CurrentCleanupDates
3458 WHERE (Mirror = 0 OR Mirror IS NULL)),
3459 CleanupMode = 'AFTER_BACKUP'
3460 WHERE Mirror = 0
3461 END
3462 END
3463
3464 IF @MirrorCleanupMode = 'AFTER_BACKUP'
3465 BEGIN
3466 INSERT INTO @CurrentCleanupDates (CleanupDate, Mirror)
3467 SELECT DATEADD(hh,-(@MirrorCleanupTime),GETDATE()), 1
3468
3469 IF NOT EXISTS(SELECT * FROM @CurrentCleanupDates WHERE (Mirror = 1 OR Mirror IS NULL) AND CleanupDate IS NULL)
3470 BEGIN
3471 UPDATE @CurrentDirectories
3472 SET CleanupDate = (SELECT MIN(CleanupDate)
3473 FROM @CurrentCleanupDates
3474 WHERE (Mirror = 1 OR Mirror IS NULL)),
3475 CleanupMode = 'AFTER_BACKUP'
3476 WHERE Mirror = 1
3477 END
3478 END
3479
3480 -- Delete old backup files, after backup
3481 IF ((@CurrentCommandOutput03 = 0 AND @Verify = 'N')
3482 OR (@CurrentCommandOutput03 = 0 AND @Verify = 'Y' AND NOT EXISTS (SELECT * FROM @CurrentBackupSet WHERE VerifyOutput <> 0 OR VerifyOutput IS NULL)))
3483 AND @HostPlatform = 'Windows'
3484 AND (@BackupSoftware <> 'DATA_DOMAIN_BOOST' OR @BackupSoftware IS NULL)
3485 AND @CurrentBackupType = @BackupType
3486 BEGIN
3487 WHILE (1 = 1)
3488 BEGIN
3489 SELECT TOP 1 @CurrentDirectoryID = ID,
3490 @CurrentDirectoryPath = DirectoryPath,
3491 @CurrentCleanupDate = CleanupDate
3492 FROM @CurrentDirectories
3493 WHERE CleanupDate IS NOT NULL
3494 AND CleanupMode = 'AFTER_BACKUP'
3495 AND CleanupCompleted = 0
3496 ORDER BY ID ASC
3497
3498 IF @@ROWCOUNT = 0
3499 BEGIN
3500 BREAK
3501 END
3502
3503 IF @BackupSoftware IS NULL
3504 BEGIN
3505 SET @CurrentCommandType05 = 'xp_delete_file'
3506
3507 SET @CurrentCommand05 = 'DECLARE @ReturnCode int EXECUTE @ReturnCode = [master].dbo.xp_delete_file 0, N''' + REPLACE(@CurrentDirectoryPath,'''','''''') + ''', ''' + @CurrentFileExtension + ''', ''' + CONVERT(nvarchar(19),@CurrentCleanupDate,126) + ''' IF @ReturnCode <> 0 RAISERROR(''Error deleting files.'', 16, 1)'
3508 END
3509
3510 IF @BackupSoftware = 'LITESPEED'
3511 BEGIN
3512 SET @CurrentCommandType05 = 'xp_slssqlmaint'
3513
3514 SET @CurrentCommand05 = 'DECLARE @ReturnCode int EXECUTE @ReturnCode = [master].dbo.xp_slssqlmaint N''-MAINTDEL -DELFOLDER "' + REPLACE(@CurrentDirectoryPath,'''','''''') + '" -DELEXTENSION "' + @CurrentFileExtension + '" -DELUNIT "' + CAST(DATEDIFF(mi,@CurrentCleanupDate,GETDATE()) + 1 AS nvarchar) + '" -DELUNITTYPE "minutes" -DELUSEAGE'' IF @ReturnCode <> 0 RAISERROR(''Error deleting LiteSpeed backup files.'', 16, 1)'
3515 END
3516
3517 IF @BackupSoftware = 'SQLBACKUP'
3518 BEGIN
3519 SET @CurrentCommandType05 = 'sqbutility'
3520
3521 SET @CurrentCommand05 = 'DECLARE @ReturnCode int EXECUTE @ReturnCode = [master].dbo.sqbutility 1032, N''' + REPLACE(@CurrentDatabaseName,'''','''''') + ''', N''' + REPLACE(@CurrentDirectoryPath,'''','''''') + ''', ''' + CASE WHEN @CurrentBackupType = 'FULL' THEN 'D' WHEN @CurrentBackupType = 'DIFF' THEN 'I' WHEN @CurrentBackupType = 'LOG' THEN 'L' END + ''', ''' + CAST(DATEDIFF(hh,@CurrentCleanupDate,GETDATE()) + 1 AS nvarchar) + 'h'', ' + ISNULL('''' + REPLACE(@EncryptionKey,'''','''''') + '''','NULL') + ' IF @ReturnCode <> 0 RAISERROR(''Error deleting SQLBackup backup files.'', 16, 1)'
3522 END
3523
3524 IF @BackupSoftware = 'SQLSAFE'
3525 BEGIN
3526 SET @CurrentCommandType05 = 'xp_ss_delete'
3527
3528 SET @CurrentCommand05 = 'DECLARE @ReturnCode int EXECUTE @ReturnCode = [master].dbo.xp_ss_delete @filename = N''' + REPLACE(@CurrentDirectoryPath,'''','''''') + '\*.' + @CurrentFileExtension + ''', @age = ''' + CAST(DATEDIFF(mi,@CurrentCleanupDate,GETDATE()) + 1 AS nvarchar) + 'Minutes'' IF @ReturnCode <> 0 RAISERROR(''Error deleting SQLsafe backup files.'', 16, 1)'
3529 END
3530
3531 EXECUTE @CurrentCommandOutput05 = [dbo].[CommandExecute] @Command = @CurrentCommand05, @CommandType = @CurrentCommandType05, @Mode = 1, @DatabaseName = @CurrentDatabaseName, @LogToTable = @LogToTable, @Execute = @Execute
3532 SET @Error = @@ERROR
3533 IF @Error <> 0 SET @CurrentCommandOutput05 = @Error
3534 IF @CurrentCommandOutput05 <> 0 SET @ReturnCode = @CurrentCommandOutput05
3535
3536 UPDATE @CurrentDirectories
3537 SET CleanupCompleted = 1,
3538 CleanupOutput = @CurrentCommandOutput05
3539 WHERE ID = @CurrentDirectoryID
3540
3541 SET @CurrentDirectoryID = NULL
3542 SET @CurrentDirectoryPath = NULL
3543 SET @CurrentCleanupDate = NULL
3544
3545 SET @CurrentCommand05 = NULL
3546
3547 SET @CurrentCommandOutput05 = NULL
3548
3549 SET @CurrentCommandType05 = NULL
3550 END
3551 END
3552 END
3553
3554 IF DATABASEPROPERTYEX(@CurrentDatabaseName,'Status') = 'SUSPECT'
3555 BEGIN
3556 SET @ErrorMessage = 'The database ' + QUOTENAME(@CurrentDatabaseName) + ' is in a SUSPECT state.'
3557 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
3558 SET @Error = @@ERROR
3559 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
3560 END
3561
3562 -- Update that the database is completed
3563 IF @DatabasesInParallel = 'Y'
3564 BEGIN
3565 UPDATE dbo.QueueDatabase
3566 SET DatabaseEndTime = GETDATE()
3567 WHERE QueueID = @QueueID
3568 AND DatabaseName = @CurrentDatabaseName
3569 END
3570 ELSE
3571 BEGIN
3572 UPDATE @tmpDatabases
3573 SET Completed = 1
3574 WHERE Selected = 1
3575 AND Completed = 0
3576 AND ID = @CurrentDBID
3577 END
3578
3579 -- Clear variables
3580 SET @CurrentDBID = NULL
3581 SET @CurrentDatabaseID = NULL
3582 SET @CurrentDatabaseName = NULL
3583 SET @CurrentBackupType = NULL
3584 SET @CurrentFileExtension = NULL
3585 SET @CurrentFileNumber = NULL
3586 SET @CurrentDifferentialBaseLSN = NULL
3587 SET @CurrentDifferentialBaseIsSnapshot = NULL
3588 SET @CurrentLogLSN = NULL
3589 SET @CurrentLatestBackup = NULL
3590 SET @CurrentDatabaseNameFS = NULL
3591 SET @CurrentDirectoryStructure = NULL
3592 SET @CurrentDatabaseFileName = NULL
3593 SET @CurrentMaxFilePathLength = NULL
3594 SET @CurrentDate = NULL
3595 SET @CurrentCleanupDate = NULL
3596 SET @CurrentIsDatabaseAccessible = NULL
3597 SET @CurrentAvailabilityGroup = NULL
3598 SET @CurrentAvailabilityGroupRole = NULL
3599 SET @CurrentAvailabilityGroupBackupPreference = NULL
3600 SET @CurrentIsPreferredBackupReplica = NULL
3601 SET @CurrentDatabaseMirroringRole = NULL
3602 SET @CurrentLogShippingRole = NULL
3603 SET @CurrentIsEncrypted = NULL
3604 SET @CurrentIsReadOnly = NULL
3605 SET @CurrentLastLogBackup = NULL
3606 SET @CurrentLogSizeSinceLastLogBackup = NULL
3607 SET @CurrentAllocatedExtentPageCount = NULL
3608 SET @CurrentModifiedExtentPageCount = NULL
3609
3610 SET @CurrentCommand03 = NULL
3611 SET @CurrentCommand06 = NULL
3612 SET @CurrentCommand07 = NULL
3613
3614 SET @CurrentCommandOutput03 = NULL
3615
3616 SET @CurrentCommandType03 = NULL
3617
3618 DELETE FROM @CurrentDirectories
3619 DELETE FROM @CurrentURLs
3620 DELETE FROM @CurrentFiles
3621 DELETE FROM @CurrentCleanupDates
3622 DELETE FROM @CurrentBackupSet
3623
3624 END
3625
3626 ----------------------------------------------------------------------------------------------------
3627 --// Log completing information //--
3628 ----------------------------------------------------------------------------------------------------
3629
3630 Logging:
3631 SET @EndMessage = 'Date and time: ' + CONVERT(nvarchar,GETDATE(),120)
3632 RAISERROR('%s',10,1,@EndMessage) WITH NOWAIT
3633
3634 IF @ReturnCode <> 0
3635 BEGIN
3636 RETURN @ReturnCode
3637 END
3638
3639 ----------------------------------------------------------------------------------------------------
3640
3641END
3642GO
3643SET ANSI_NULLS ON
3644GO
3645SET QUOTED_IDENTIFIER ON
3646GO
3647IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[DatabaseIntegrityCheck]') AND type in (N'P', N'PC'))
3648BEGIN
3649EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[DatabaseIntegrityCheck] AS'
3650END
3651GO
3652ALTER PROCEDURE [dbo].[DatabaseIntegrityCheck]
3653
3654@Databases nvarchar(max) = NULL,
3655@CheckCommands nvarchar(max) = 'CHECKDB',
3656@PhysicalOnly nvarchar(max) = 'N',
3657@NoIndex nvarchar(max) = 'N',
3658@ExtendedLogicalChecks nvarchar(max) = 'N',
3659@TabLock nvarchar(max) = 'N',
3660@FileGroups nvarchar(max) = NULL,
3661@Objects nvarchar(max) = NULL,
3662@MaxDOP int = NULL,
3663@AvailabilityGroups nvarchar(max) = NULL,
3664@AvailabilityGroupReplicas nvarchar(max) = 'ALL',
3665@Updateability nvarchar(max) = 'ALL',
3666@TimeLimit int = NULL,
3667@LockTimeout int = NULL,
3668@LockMessageSeverity int = 16,
3669@DatabaseOrder nvarchar(max) = NULL,
3670@DatabasesInParallel nvarchar(max) = 'N',
3671@LogToTable nvarchar(max) = 'N',
3672@Execute nvarchar(max) = 'Y'
3673
3674AS
3675
3676BEGIN
3677
3678 ----------------------------------------------------------------------------------------------------
3679 --// Source: https://ola.hallengren.com //--
3680 --// License: https://ola.hallengren.com/license.html //--
3681 --// GitHub: https://github.com/olahallengren/sql-server-maintenance-solution //--
3682 --// Version: 2019-04-28 16:40:00 //--
3683 ----------------------------------------------------------------------------------------------------
3684
3685 SET NOCOUNT ON
3686
3687 DECLARE @StartMessage nvarchar(max)
3688 DECLARE @EndMessage nvarchar(max)
3689 DECLARE @DatabaseMessage nvarchar(max)
3690 DECLARE @ErrorMessage nvarchar(max)
3691 DECLARE @Severity int
3692
3693 DECLARE @StartTime datetime
3694 DECLARE @SchemaName nvarchar(max)
3695 DECLARE @ObjectName nvarchar(max)
3696 DECLARE @VersionTimestamp nvarchar(max)
3697 DECLARE @Parameters nvarchar(max)
3698
3699 DECLARE @Version numeric(18,10)
3700 DECLARE @HostPlatform nvarchar(max)
3701 DECLARE @AmazonRDS bit
3702
3703 DECLARE @QueueID int
3704 DECLARE @QueueStartTime datetime
3705
3706 DECLARE @CurrentDBID int
3707 DECLARE @CurrentDatabaseID int
3708 DECLARE @CurrentDatabaseName nvarchar(max)
3709 DECLARE @CurrentIsDatabaseAccessible bit
3710 DECLARE @CurrentAvailabilityGroup nvarchar(max)
3711 DECLARE @CurrentAvailabilityGroupRole nvarchar(max)
3712 DECLARE @CurrentAvailabilityGroupBackupPreference nvarchar(max)
3713 DECLARE @CurrentIsPreferredBackupReplica bit
3714 DECLARE @CurrentDatabaseMirroringRole nvarchar(max)
3715 DECLARE @CurrentIsReadOnly bit
3716
3717 DECLARE @CurrentFGID int
3718 DECLARE @CurrentFileGroupID int
3719 DECLARE @CurrentFileGroupName nvarchar(max)
3720 DECLARE @CurrentFileGroupExists bit
3721
3722 DECLARE @CurrentOID int
3723 DECLARE @CurrentSchemaID int
3724 DECLARE @CurrentSchemaName nvarchar(max)
3725 DECLARE @CurrentObjectID int
3726 DECLARE @CurrentObjectName nvarchar(max)
3727 DECLARE @CurrentObjectType nvarchar(max)
3728 DECLARE @CurrentObjectExists bit
3729
3730 DECLARE @CurrentCommand01 nvarchar(max)
3731 DECLARE @CurrentCommand02 nvarchar(max)
3732 DECLARE @CurrentCommand03 nvarchar(max)
3733 DECLARE @CurrentCommand04 nvarchar(max)
3734 DECLARE @CurrentCommand05 nvarchar(max)
3735 DECLARE @CurrentCommand06 nvarchar(max)
3736 DECLARE @CurrentCommand07 nvarchar(max)
3737 DECLARE @CurrentCommand08 nvarchar(max)
3738 DECLARE @CurrentCommand09 nvarchar(max)
3739
3740 DECLARE @CurrentCommandOutput01 int
3741 DECLARE @CurrentCommandOutput04 int
3742 DECLARE @CurrentCommandOutput05 int
3743 DECLARE @CurrentCommandOutput08 int
3744 DECLARE @CurrentCommandOutput09 int
3745
3746 DECLARE @CurrentCommandType01 nvarchar(max)
3747 DECLARE @CurrentCommandType04 nvarchar(max)
3748 DECLARE @CurrentCommandType05 nvarchar(max)
3749 DECLARE @CurrentCommandType08 nvarchar(max)
3750 DECLARE @CurrentCommandType09 nvarchar(max)
3751
3752 DECLARE @tmpDatabases TABLE (ID int IDENTITY,
3753 DatabaseName nvarchar(max),
3754 DatabaseType nvarchar(max),
3755 AvailabilityGroup bit,
3756 [Snapshot] bit,
3757 StartPosition int,
3758 LastCommandTime datetime,
3759 DatabaseSize bigint,
3760 LastGoodCheckDbTime datetime,
3761 [Order] int,
3762 Selected bit,
3763 Completed bit,
3764 PRIMARY KEY(Selected, Completed, [Order], ID))
3765
3766 DECLARE @tmpAvailabilityGroups TABLE (ID int IDENTITY PRIMARY KEY,
3767 AvailabilityGroupName nvarchar(max),
3768 StartPosition int,
3769 Selected bit)
3770
3771 DECLARE @tmpDatabasesAvailabilityGroups TABLE (DatabaseName nvarchar(max),
3772 AvailabilityGroupName nvarchar(max))
3773
3774 DECLARE @tmpFileGroups TABLE (ID int IDENTITY,
3775 FileGroupID int,
3776 FileGroupName nvarchar(max),
3777 StartPosition int,
3778 [Order] int,
3779 Selected bit,
3780 Completed bit,
3781 PRIMARY KEY(Selected, Completed, [Order], ID))
3782
3783 DECLARE @tmpObjects TABLE (ID int IDENTITY,
3784 SchemaID int,
3785 SchemaName nvarchar(max),
3786 ObjectID int,
3787 ObjectName nvarchar(max),
3788 ObjectType nvarchar(max),
3789 StartPosition int,
3790 [Order] int,
3791 Selected bit,
3792 Completed bit,
3793 PRIMARY KEY(Selected, Completed, [Order], ID))
3794
3795 DECLARE @SelectedDatabases TABLE (DatabaseName nvarchar(max),
3796 DatabaseType nvarchar(max),
3797 AvailabilityGroup nvarchar(max),
3798 StartPosition int,
3799 Selected bit)
3800
3801 DECLARE @SelectedAvailabilityGroups TABLE (AvailabilityGroupName nvarchar(max),
3802 StartPosition int,
3803 Selected bit)
3804
3805 DECLARE @SelectedFileGroups TABLE (DatabaseName nvarchar(max),
3806 FileGroupName nvarchar(max),
3807 StartPosition int,
3808 Selected bit)
3809
3810 DECLARE @SelectedObjects TABLE (DatabaseName nvarchar(max),
3811 SchemaName nvarchar(max),
3812 ObjectName nvarchar(max),
3813 StartPosition int,
3814 Selected bit)
3815
3816 DECLARE @SelectedCheckCommands TABLE (CheckCommand nvarchar(max))
3817
3818 DECLARE @Error int
3819 DECLARE @ReturnCode int
3820
3821 DECLARE @EmptyLine nvarchar(max)
3822
3823 SET @Error = 0
3824 SET @ReturnCode = 0
3825
3826 SET @EmptyLine = CHAR(9)
3827
3828 SET @Version = CAST(LEFT(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max)),CHARINDEX('.',CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max))) - 1) + '.' + REPLACE(RIGHT(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max)), LEN(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max))) - CHARINDEX('.',CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max)))),'.','') AS numeric(18,10))
3829
3830 IF @Version >= 14
3831 BEGIN
3832 SELECT @HostPlatform = host_platform
3833 FROM sys.dm_os_host_info
3834 END
3835 ELSE
3836 BEGIN
3837 SET @HostPlatform = 'Windows'
3838 END
3839
3840 SET @AmazonRDS = CASE WHEN DB_ID('rdsadmin') IS NOT NULL AND SUSER_SNAME(0x01) = 'rdsa' THEN 1 ELSE 0 END
3841
3842 ----------------------------------------------------------------------------------------------------
3843 --// Log initial information //--
3844 ----------------------------------------------------------------------------------------------------
3845
3846 SET @StartTime = GETDATE()
3847 SET @SchemaName = (SELECT schemas.name FROM sys.schemas schemas INNER JOIN sys.objects objects ON schemas.[schema_id] = objects.[schema_id] WHERE [object_id] = @@PROCID)
3848 SET @ObjectName = OBJECT_NAME(@@PROCID)
3849 SET @VersionTimestamp = SUBSTRING(OBJECT_DEFINITION(@@PROCID),CHARINDEX('--// Version: ',OBJECT_DEFINITION(@@PROCID)) + LEN('--// Version: ') + 1, 19)
3850
3851 SET @Parameters = '@Databases = ' + ISNULL('''' + REPLACE(@Databases,'''','''''') + '''','NULL')
3852 SET @Parameters = @Parameters + ', @CheckCommands = ' + ISNULL('''' + REPLACE(@CheckCommands,'''','''''') + '''','NULL')
3853 SET @Parameters = @Parameters + ', @PhysicalOnly = ' + ISNULL('''' + REPLACE(@PhysicalOnly,'''','''''') + '''','NULL')
3854 SET @Parameters = @Parameters + ', @NoIndex = ' + ISNULL('''' + REPLACE(@NoIndex,'''','''''') + '''','NULL')
3855 SET @Parameters = @Parameters + ', @ExtendedLogicalChecks = ' + ISNULL('''' + REPLACE(@ExtendedLogicalChecks,'''','''''') + '''','NULL')
3856 SET @Parameters = @Parameters + ', @TabLock = ' + ISNULL('''' + REPLACE(@TabLock,'''','''''') + '''','NULL')
3857 SET @Parameters = @Parameters + ', @FileGroups = ' + ISNULL('''' + REPLACE(@FileGroups,'''','''''') + '''','NULL')
3858 SET @Parameters = @Parameters + ', @Objects = ' + ISNULL('''' + REPLACE(@Objects,'''','''''') + '''','NULL')
3859 SET @Parameters = @Parameters + ', @MaxDOP = ' + ISNULL(CAST(@MaxDOP AS nvarchar),'NULL')
3860 SET @Parameters = @Parameters + ', @AvailabilityGroups = ' + ISNULL('''' + REPLACE(@AvailabilityGroups,'''','''''') + '''','NULL')
3861 SET @Parameters = @Parameters + ', @AvailabilityGroupReplicas = ' + ISNULL('''' + REPLACE(@AvailabilityGroupReplicas,'''','''''') + '''','NULL')
3862 SET @Parameters = @Parameters + ', @Updateability = ' + ISNULL('''' + REPLACE(@Updateability,'''','''''') + '''','NULL')
3863 SET @Parameters = @Parameters + ', @TimeLimit = ' + ISNULL(CAST(@TimeLimit AS nvarchar),'NULL')
3864 SET @Parameters = @Parameters + ', @LockTimeout = ' + ISNULL(CAST(@LockTimeout AS nvarchar),'NULL')
3865 SET @Parameters = @Parameters + ', @LockMessageSeverity = ' + ISNULL(CAST(@LockMessageSeverity AS nvarchar),'NULL')
3866 SET @Parameters = @Parameters + ', @DatabaseOrder = ' + ISNULL('''' + REPLACE(@DatabaseOrder,'''','''''') + '''','NULL')
3867 SET @Parameters = @Parameters + ', @DatabasesInParallel = ' + ISNULL('''' + REPLACE(@DatabasesInParallel,'''','''''') + '''','NULL')
3868 SET @Parameters = @Parameters + ', @LogToTable = ' + ISNULL('''' + REPLACE(@LogToTable,'''','''''') + '''','NULL')
3869 SET @Parameters = @Parameters + ', @Execute = ' + ISNULL('''' + REPLACE(@Execute,'''','''''') + '''','NULL')
3870
3871 SET @StartMessage = 'Date and time: ' + CONVERT(nvarchar,@StartTime,120)
3872 RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT
3873
3874 SET @StartMessage = 'Server: ' + CAST(SERVERPROPERTY('ServerName') AS nvarchar(max))
3875 RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT
3876
3877 SET @StartMessage = 'Version: ' + CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max))
3878 RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT
3879
3880 SET @StartMessage = 'Edition: ' + CAST(SERVERPROPERTY('Edition') AS nvarchar(max))
3881 RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT
3882
3883 SET @StartMessage = 'Platform: ' + @HostPlatform
3884 RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT
3885
3886 SET @StartMessage = 'Procedure: ' + QUOTENAME(DB_NAME(DB_ID())) + '.' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(@ObjectName)
3887 RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT
3888
3889 SET @StartMessage = 'Parameters: ' + @Parameters
3890 RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT
3891
3892 SET @StartMessage = 'Version: ' + @VersionTimestamp
3893 RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT
3894
3895 SET @StartMessage = 'Source: https://ola.hallengren.com'
3896 RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT
3897
3898 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
3899
3900 ----------------------------------------------------------------------------------------------------
3901 --// Check core requirements //--
3902 ----------------------------------------------------------------------------------------------------
3903
3904 IF NOT (SELECT [compatibility_level] FROM sys.databases WHERE database_id = DB_ID()) >= 90
3905 BEGIN
3906 SET @ErrorMessage = 'The database ' + QUOTENAME(DB_NAME(DB_ID())) + ' has to be in compatibility level 90 or higher.'
3907 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
3908 SET @Error = @@ERROR
3909 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
3910 END
3911
3912 IF NOT (SELECT uses_ansi_nulls FROM sys.sql_modules WHERE [object_id] = @@PROCID) = 1
3913 BEGIN
3914 SET @ErrorMessage = 'ANSI_NULLS has to be set to ON for the stored procedure.'
3915 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
3916 SET @Error = @@ERROR
3917 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
3918 END
3919
3920 IF NOT (SELECT uses_quoted_identifier FROM sys.sql_modules WHERE [object_id] = @@PROCID) = 1
3921 BEGIN
3922 SET @ErrorMessage = 'QUOTED_IDENTIFIER has to be set to ON for the stored procedure.'
3923 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
3924 SET @Error = @@ERROR
3925 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
3926 END
3927
3928 IF NOT EXISTS (SELECT * FROM sys.objects objects INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] WHERE objects.[type] = 'P' AND schemas.[name] = 'dbo' AND objects.[name] = 'CommandExecute')
3929 BEGIN
3930 SET @ErrorMessage = 'The stored procedure CommandExecute is missing. Download https://ola.hallengren.com/scripts/CommandExecute.sql.'
3931 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
3932 SET @Error = @@ERROR
3933 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
3934 END
3935
3936 IF EXISTS (SELECT * FROM sys.objects objects INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] WHERE objects.[type] = 'P' AND schemas.[name] = 'dbo' AND objects.[name] = 'CommandExecute' AND OBJECT_DEFINITION(objects.[object_id]) NOT LIKE '%@LockMessageSeverity%')
3937 BEGIN
3938 SET @ErrorMessage = 'The stored procedure CommandExecute needs to be updated. Download https://ola.hallengren.com/scripts/CommandExecute.sql.'
3939 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
3940 SET @Error = @@ERROR
3941 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
3942 END
3943
3944 IF @LogToTable = 'Y' AND NOT EXISTS (SELECT * FROM sys.objects objects INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] WHERE objects.[type] = 'U' AND schemas.[name] = 'dbo' AND objects.[name] = 'CommandLog')
3945 BEGIN
3946 SET @ErrorMessage = 'The table CommandLog is missing. Download https://ola.hallengren.com/scripts/CommandLog.sql.'
3947 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
3948 SET @Error = @@ERROR
3949 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
3950 END
3951
3952 IF @DatabasesInParallel = 'Y' AND NOT EXISTS (SELECT * FROM sys.objects objects INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] WHERE objects.[type] = 'U' AND schemas.[name] = 'dbo' AND objects.[name] = 'Queue')
3953 BEGIN
3954 SET @ErrorMessage = 'The table Queue is missing. Download https://ola.hallengren.com/scripts/Queue.sql.'
3955 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
3956 SET @Error = @@ERROR
3957 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
3958 END
3959
3960 IF @DatabasesInParallel = 'Y' AND NOT EXISTS (SELECT * FROM sys.objects objects INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] WHERE objects.[type] = 'U' AND schemas.[name] = 'dbo' AND objects.[name] = 'QueueDatabase')
3961 BEGIN
3962 SET @ErrorMessage = 'The table QueueDatabase is missing. Download https://ola.hallengren.com/scripts/QueueDatabase.sql.'
3963 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
3964 SET @Error = @@ERROR
3965 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
3966 END
3967
3968 IF @@TRANCOUNT <> 0
3969 BEGIN
3970 SET @ErrorMessage = 'The transaction count is not 0.'
3971 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
3972 SET @Error = @@ERROR
3973 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
3974 END
3975
3976 IF @Error <> 0
3977 BEGIN
3978 SET @ReturnCode = @Error
3979 GOTO Logging
3980 END
3981
3982 ----------------------------------------------------------------------------------------------------
3983 --// Select databases //--
3984 ----------------------------------------------------------------------------------------------------
3985
3986 SET @Databases = REPLACE(@Databases, CHAR(10), '')
3987 SET @Databases = REPLACE(@Databases, CHAR(13), '')
3988
3989 WHILE CHARINDEX(', ',@Databases) > 0 SET @Databases = REPLACE(@Databases,', ',',')
3990 WHILE CHARINDEX(' ,',@Databases) > 0 SET @Databases = REPLACE(@Databases,' ,',',')
3991
3992 SET @Databases = LTRIM(RTRIM(@Databases));
3993
3994 WITH Databases1 (StartPosition, EndPosition, DatabaseItem) AS
3995 (
3996 SELECT 1 AS StartPosition,
3997 ISNULL(NULLIF(CHARINDEX(',', @Databases, 1), 0), LEN(@Databases) + 1) AS EndPosition,
3998 SUBSTRING(@Databases, 1, ISNULL(NULLIF(CHARINDEX(',', @Databases, 1), 0), LEN(@Databases) + 1) - 1) AS DatabaseItem
3999 WHERE @Databases IS NOT NULL
4000 UNION ALL
4001 SELECT CAST(EndPosition AS int) + 1 AS StartPosition,
4002 ISNULL(NULLIF(CHARINDEX(',', @Databases, EndPosition + 1), 0), LEN(@Databases) + 1) AS EndPosition,
4003 SUBSTRING(@Databases, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(',', @Databases, EndPosition + 1), 0), LEN(@Databases) + 1) - EndPosition - 1) AS DatabaseItem
4004 FROM Databases1
4005 WHERE EndPosition < LEN(@Databases) + 1
4006 ),
4007 Databases2 (DatabaseItem, StartPosition, Selected) AS
4008 (
4009 SELECT CASE WHEN DatabaseItem LIKE '-%' THEN RIGHT(DatabaseItem,LEN(DatabaseItem) - 1) ELSE DatabaseItem END AS DatabaseItem,
4010 StartPosition,
4011 CASE WHEN DatabaseItem LIKE '-%' THEN 0 ELSE 1 END AS Selected
4012 FROM Databases1
4013 ),
4014 Databases3 (DatabaseItem, DatabaseType, AvailabilityGroup, StartPosition, Selected) AS
4015 (
4016 SELECT CASE WHEN DatabaseItem IN('ALL_DATABASES','SYSTEM_DATABASES','USER_DATABASES','AVAILABILITY_GROUP_DATABASES') THEN '%' ELSE DatabaseItem END AS DatabaseItem,
4017 CASE WHEN DatabaseItem = 'SYSTEM_DATABASES' THEN 'S' WHEN DatabaseItem = 'USER_DATABASES' THEN 'U' ELSE NULL END AS DatabaseType,
4018 CASE WHEN DatabaseItem = 'AVAILABILITY_GROUP_DATABASES' THEN 1 ELSE NULL END AvailabilityGroup,
4019 StartPosition,
4020 Selected
4021 FROM Databases2
4022 ),
4023 Databases4 (DatabaseName, DatabaseType, AvailabilityGroup, StartPosition, Selected) AS
4024 (
4025 SELECT CASE WHEN LEFT(DatabaseItem,1) = '[' AND RIGHT(DatabaseItem,1) = ']' THEN PARSENAME(DatabaseItem,1) ELSE DatabaseItem END AS DatabaseItem,
4026 DatabaseType,
4027 AvailabilityGroup,
4028 StartPosition,
4029 Selected
4030 FROM Databases3
4031 )
4032 INSERT INTO @SelectedDatabases (DatabaseName, DatabaseType, AvailabilityGroup, StartPosition, Selected)
4033 SELECT DatabaseName,
4034 DatabaseType,
4035 AvailabilityGroup,
4036 StartPosition,
4037 Selected
4038 FROM Databases4
4039 OPTION (MAXRECURSION 0)
4040
4041 IF @Version >= 11 AND SERVERPROPERTY('IsHadrEnabled') = 1
4042 BEGIN
4043 INSERT INTO @tmpAvailabilityGroups (AvailabilityGroupName, Selected)
4044 SELECT name AS AvailabilityGroupName,
4045 0 AS Selected
4046 FROM sys.availability_groups
4047
4048 INSERT INTO @tmpDatabasesAvailabilityGroups (DatabaseName, AvailabilityGroupName)
4049 SELECT databases.name,
4050 availability_groups.name
4051 FROM sys.databases databases
4052 INNER JOIN sys.dm_hadr_availability_replica_states dm_hadr_availability_replica_states ON databases.replica_id = dm_hadr_availability_replica_states.replica_id
4053 INNER JOIN sys.availability_groups availability_groups ON dm_hadr_availability_replica_states.group_id = availability_groups.group_id
4054 END
4055
4056 INSERT INTO @tmpDatabases (DatabaseName, DatabaseType, AvailabilityGroup, [Snapshot], [Order], Selected, Completed)
4057 SELECT [name] AS DatabaseName,
4058 CASE WHEN name IN('master','msdb','model') THEN 'S' ELSE 'U' END AS DatabaseType,
4059 NULL AS AvailabilityGroup,
4060 CASE WHEN source_database_id IS NOT NULL THEN 1 ELSE 0 END AS [Snapshot],
4061 0 AS [Order],
4062 0 AS Selected,
4063 0 AS Completed
4064 FROM sys.databases
4065 ORDER BY [name] ASC
4066
4067 UPDATE tmpDatabases
4068 SET AvailabilityGroup = CASE WHEN EXISTS (SELECT * FROM @tmpDatabasesAvailabilityGroups WHERE DatabaseName = tmpDatabases.DatabaseName) THEN 1 ELSE 0 END
4069 FROM @tmpDatabases tmpDatabases
4070
4071 UPDATE tmpDatabases
4072 SET tmpDatabases.Selected = SelectedDatabases.Selected
4073 FROM @tmpDatabases tmpDatabases
4074 INNER JOIN @SelectedDatabases SelectedDatabases
4075 ON tmpDatabases.DatabaseName LIKE REPLACE(SelectedDatabases.DatabaseName,'_','[_]')
4076 AND (tmpDatabases.DatabaseType = SelectedDatabases.DatabaseType OR SelectedDatabases.DatabaseType IS NULL)
4077 AND (tmpDatabases.AvailabilityGroup = SelectedDatabases.AvailabilityGroup OR SelectedDatabases.AvailabilityGroup IS NULL)
4078 AND NOT ((tmpDatabases.DatabaseName = 'tempdb' OR tmpDatabases.[Snapshot] = 1) AND tmpDatabases.DatabaseName <> SelectedDatabases.DatabaseName)
4079 WHERE SelectedDatabases.Selected = 1
4080
4081 UPDATE tmpDatabases
4082 SET tmpDatabases.Selected = SelectedDatabases.Selected
4083 FROM @tmpDatabases tmpDatabases
4084 INNER JOIN @SelectedDatabases SelectedDatabases
4085 ON tmpDatabases.DatabaseName LIKE REPLACE(SelectedDatabases.DatabaseName,'_','[_]')
4086 AND (tmpDatabases.DatabaseType = SelectedDatabases.DatabaseType OR SelectedDatabases.DatabaseType IS NULL)
4087 AND (tmpDatabases.AvailabilityGroup = SelectedDatabases.AvailabilityGroup OR SelectedDatabases.AvailabilityGroup IS NULL)
4088 AND NOT ((tmpDatabases.DatabaseName = 'tempdb' OR tmpDatabases.[Snapshot] = 1) AND tmpDatabases.DatabaseName <> SelectedDatabases.DatabaseName)
4089 WHERE SelectedDatabases.Selected = 0
4090
4091 UPDATE tmpDatabases
4092 SET tmpDatabases.StartPosition = SelectedDatabases2.StartPosition
4093 FROM @tmpDatabases tmpDatabases
4094 INNER JOIN (SELECT tmpDatabases.DatabaseName, MIN(SelectedDatabases.StartPosition) AS StartPosition
4095 FROM @tmpDatabases tmpDatabases
4096 INNER JOIN @SelectedDatabases SelectedDatabases
4097 ON tmpDatabases.DatabaseName LIKE REPLACE(SelectedDatabases.DatabaseName,'_','[_]')
4098 AND (tmpDatabases.DatabaseType = SelectedDatabases.DatabaseType OR SelectedDatabases.DatabaseType IS NULL)
4099 AND (tmpDatabases.AvailabilityGroup = SelectedDatabases.AvailabilityGroup OR SelectedDatabases.AvailabilityGroup IS NULL)
4100 WHERE SelectedDatabases.Selected = 1
4101 GROUP BY tmpDatabases.DatabaseName) SelectedDatabases2
4102 ON tmpDatabases.DatabaseName = SelectedDatabases2.DatabaseName
4103
4104 IF @Databases IS NOT NULL AND (NOT EXISTS(SELECT * FROM @SelectedDatabases) OR EXISTS(SELECT * FROM @SelectedDatabases WHERE DatabaseName IS NULL OR DatabaseName = ''))
4105 BEGIN
4106 SET @ErrorMessage = 'The value for the parameter @Databases is not supported.'
4107 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
4108 SET @Error = @@ERROR
4109 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
4110 END
4111
4112 ----------------------------------------------------------------------------------------------------
4113 --// Select availability groups //--
4114 ----------------------------------------------------------------------------------------------------
4115
4116 IF @AvailabilityGroups IS NOT NULL AND @Version >= 11 AND SERVERPROPERTY('IsHadrEnabled') = 1
4117 BEGIN
4118
4119 SET @AvailabilityGroups = REPLACE(@AvailabilityGroups, CHAR(10), '')
4120 SET @AvailabilityGroups = REPLACE(@AvailabilityGroups, CHAR(13), '')
4121
4122 WHILE CHARINDEX(', ',@AvailabilityGroups) > 0 SET @AvailabilityGroups = REPLACE(@AvailabilityGroups,', ',',')
4123 WHILE CHARINDEX(' ,',@AvailabilityGroups) > 0 SET @AvailabilityGroups = REPLACE(@AvailabilityGroups,' ,',',')
4124
4125 SET @AvailabilityGroups = LTRIM(RTRIM(@AvailabilityGroups));
4126
4127 WITH AvailabilityGroups1 (StartPosition, EndPosition, AvailabilityGroupItem) AS
4128 (
4129 SELECT 1 AS StartPosition,
4130 ISNULL(NULLIF(CHARINDEX(',', @AvailabilityGroups, 1), 0), LEN(@AvailabilityGroups) + 1) AS EndPosition,
4131 SUBSTRING(@AvailabilityGroups, 1, ISNULL(NULLIF(CHARINDEX(',', @AvailabilityGroups, 1), 0), LEN(@AvailabilityGroups) + 1) - 1) AS AvailabilityGroupItem
4132 WHERE @AvailabilityGroups IS NOT NULL
4133 UNION ALL
4134 SELECT CAST(EndPosition AS int) + 1 AS StartPosition,
4135 ISNULL(NULLIF(CHARINDEX(',', @AvailabilityGroups, EndPosition + 1), 0), LEN(@AvailabilityGroups) + 1) AS EndPosition,
4136 SUBSTRING(@AvailabilityGroups, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(',', @AvailabilityGroups, EndPosition + 1), 0), LEN(@AvailabilityGroups) + 1) - EndPosition - 1) AS AvailabilityGroupItem
4137 FROM AvailabilityGroups1
4138 WHERE EndPosition < LEN(@AvailabilityGroups) + 1
4139 ),
4140 AvailabilityGroups2 (AvailabilityGroupItem, StartPosition, Selected) AS
4141 (
4142 SELECT CASE WHEN AvailabilityGroupItem LIKE '-%' THEN RIGHT(AvailabilityGroupItem,LEN(AvailabilityGroupItem) - 1) ELSE AvailabilityGroupItem END AS AvailabilityGroupItem,
4143 StartPosition,
4144 CASE WHEN AvailabilityGroupItem LIKE '-%' THEN 0 ELSE 1 END AS Selected
4145 FROM AvailabilityGroups1
4146 ),
4147 AvailabilityGroups3 (AvailabilityGroupItem, StartPosition, Selected) AS
4148 (
4149 SELECT CASE WHEN AvailabilityGroupItem = 'ALL_AVAILABILITY_GROUPS' THEN '%' ELSE AvailabilityGroupItem END AS AvailabilityGroupItem,
4150 StartPosition,
4151 Selected
4152 FROM AvailabilityGroups2
4153 ),
4154 AvailabilityGroups4 (AvailabilityGroupName, StartPosition, Selected) AS
4155 (
4156 SELECT CASE WHEN LEFT(AvailabilityGroupItem,1) = '[' AND RIGHT(AvailabilityGroupItem,1) = ']' THEN PARSENAME(AvailabilityGroupItem,1) ELSE AvailabilityGroupItem END AS AvailabilityGroupItem,
4157 StartPosition,
4158 Selected
4159 FROM AvailabilityGroups3
4160 )
4161 INSERT INTO @SelectedAvailabilityGroups (AvailabilityGroupName, StartPosition, Selected)
4162 SELECT AvailabilityGroupName, StartPosition, Selected
4163 FROM AvailabilityGroups4
4164 OPTION (MAXRECURSION 0)
4165
4166 UPDATE tmpAvailabilityGroups
4167 SET tmpAvailabilityGroups.Selected = SelectedAvailabilityGroups.Selected
4168 FROM @tmpAvailabilityGroups tmpAvailabilityGroups
4169 INNER JOIN @SelectedAvailabilityGroups SelectedAvailabilityGroups
4170 ON tmpAvailabilityGroups.AvailabilityGroupName LIKE REPLACE(SelectedAvailabilityGroups.AvailabilityGroupName,'_','[_]')
4171 WHERE SelectedAvailabilityGroups.Selected = 1
4172
4173 UPDATE tmpAvailabilityGroups
4174 SET tmpAvailabilityGroups.Selected = SelectedAvailabilityGroups.Selected
4175 FROM @tmpAvailabilityGroups tmpAvailabilityGroups
4176 INNER JOIN @SelectedAvailabilityGroups SelectedAvailabilityGroups
4177 ON tmpAvailabilityGroups.AvailabilityGroupName LIKE REPLACE(SelectedAvailabilityGroups.AvailabilityGroupName,'_','[_]')
4178 WHERE SelectedAvailabilityGroups.Selected = 0
4179
4180 UPDATE tmpAvailabilityGroups
4181 SET tmpAvailabilityGroups.StartPosition = SelectedAvailabilityGroups2.StartPosition
4182 FROM @tmpAvailabilityGroups tmpAvailabilityGroups
4183 INNER JOIN (SELECT tmpAvailabilityGroups.AvailabilityGroupName, MIN(SelectedAvailabilityGroups.StartPosition) AS StartPosition
4184 FROM @tmpAvailabilityGroups tmpAvailabilityGroups
4185 INNER JOIN @SelectedAvailabilityGroups SelectedAvailabilityGroups
4186 ON tmpAvailabilityGroups.AvailabilityGroupName LIKE REPLACE(SelectedAvailabilityGroups.AvailabilityGroupName,'_','[_]')
4187 WHERE SelectedAvailabilityGroups.Selected = 1
4188 GROUP BY tmpAvailabilityGroups.AvailabilityGroupName) SelectedAvailabilityGroups2
4189 ON tmpAvailabilityGroups.AvailabilityGroupName = SelectedAvailabilityGroups2.AvailabilityGroupName
4190
4191 UPDATE tmpDatabases
4192 SET tmpDatabases.StartPosition = tmpAvailabilityGroups.StartPosition,
4193 tmpDatabases.Selected = 1
4194 FROM @tmpDatabases tmpDatabases
4195 INNER JOIN @tmpDatabasesAvailabilityGroups tmpDatabasesAvailabilityGroups ON tmpDatabases.DatabaseName = tmpDatabasesAvailabilityGroups.DatabaseName
4196 INNER JOIN @tmpAvailabilityGroups tmpAvailabilityGroups ON tmpDatabasesAvailabilityGroups.AvailabilityGroupName = tmpAvailabilityGroups.AvailabilityGroupName
4197 WHERE tmpAvailabilityGroups.Selected = 1
4198
4199 END
4200
4201 IF @AvailabilityGroups IS NOT NULL AND (NOT EXISTS(SELECT * FROM @SelectedAvailabilityGroups) OR EXISTS(SELECT * FROM @SelectedAvailabilityGroups WHERE AvailabilityGroupName IS NULL OR AvailabilityGroupName = '') OR @Version < 11 OR SERVERPROPERTY('IsHadrEnabled') = 0)
4202 BEGIN
4203 SET @ErrorMessage = 'The value for the parameter @AvailabilityGroups is not supported.'
4204 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
4205 SET @Error = @@ERROR
4206 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
4207 END
4208
4209 IF (@Databases IS NULL AND @AvailabilityGroups IS NULL)
4210 BEGIN
4211 SET @ErrorMessage = 'You need to specify one of the parameters @Databases and @AvailabilityGroups.'
4212 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
4213 SET @Error = @@ERROR
4214 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
4215 END
4216
4217 IF (@Databases IS NOT NULL AND @AvailabilityGroups IS NOT NULL)
4218 BEGIN
4219 SET @ErrorMessage = 'You can only specify one of the parameters @Databases and @AvailabilityGroups.'
4220 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
4221 SET @Error = @@ERROR
4222 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
4223 END
4224
4225 ----------------------------------------------------------------------------------------------------
4226 --// Select filegroups //--
4227 ----------------------------------------------------------------------------------------------------
4228
4229 SET @FileGroups = REPLACE(@FileGroups, CHAR(10), '')
4230 SET @FileGroups = REPLACE(@FileGroups, CHAR(13), '')
4231
4232 WHILE CHARINDEX(', ',@FileGroups) > 0 SET @FileGroups = REPLACE(@FileGroups,', ',',')
4233 WHILE CHARINDEX(' ,',@FileGroups) > 0 SET @FileGroups = REPLACE(@FileGroups,' ,',',')
4234
4235 SET @FileGroups = LTRIM(RTRIM(@FileGroups));
4236
4237 WITH FileGroups1 (StartPosition, EndPosition, FileGroupItem) AS
4238 (
4239 SELECT 1 AS StartPosition,
4240 ISNULL(NULLIF(CHARINDEX(',', @FileGroups, 1), 0), LEN(@FileGroups) + 1) AS EndPosition,
4241 SUBSTRING(@FileGroups, 1, ISNULL(NULLIF(CHARINDEX(',', @FileGroups, 1), 0), LEN(@FileGroups) + 1) - 1) AS FileGroupItem
4242 WHERE @FileGroups IS NOT NULL
4243 UNION ALL
4244 SELECT CAST(EndPosition AS int) + 1 AS StartPosition,
4245 ISNULL(NULLIF(CHARINDEX(',', @FileGroups, EndPosition + 1), 0), LEN(@FileGroups) + 1) AS EndPosition,
4246 SUBSTRING(@FileGroups, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(',', @FileGroups, EndPosition + 1), 0), LEN(@FileGroups) + 1) - EndPosition - 1) AS FileGroupItem
4247 FROM FileGroups1
4248 WHERE EndPosition < LEN(@FileGroups) + 1
4249 ),
4250 FileGroups2 (FileGroupItem, StartPosition, Selected) AS
4251 (
4252 SELECT CASE WHEN FileGroupItem LIKE '-%' THEN RIGHT(FileGroupItem,LEN(FileGroupItem) - 1) ELSE FileGroupItem END AS FileGroupItem,
4253 StartPosition,
4254 CASE WHEN FileGroupItem LIKE '-%' THEN 0 ELSE 1 END AS Selected
4255 FROM FileGroups1
4256 ),
4257 FileGroups3 (FileGroupItem, StartPosition, Selected) AS
4258 (
4259 SELECT CASE WHEN FileGroupItem = 'ALL_FILEGROUPS' THEN '%.%' ELSE FileGroupItem END AS FileGroupItem,
4260 StartPosition,
4261 Selected
4262 FROM FileGroups2
4263 ),
4264 FileGroups4 (DatabaseName, FileGroupName, StartPosition, Selected) AS
4265 (
4266 SELECT CASE WHEN PARSENAME(FileGroupItem,4) IS NULL AND PARSENAME(FileGroupItem,3) IS NULL THEN PARSENAME(FileGroupItem,2) ELSE NULL END AS DatabaseName,
4267 CASE WHEN PARSENAME(FileGroupItem,4) IS NULL AND PARSENAME(FileGroupItem,3) IS NULL THEN PARSENAME(FileGroupItem,1) ELSE NULL END AS FileGroupName,
4268 StartPosition,
4269 Selected
4270 FROM FileGroups3
4271 )
4272 INSERT INTO @SelectedFileGroups (DatabaseName, FileGroupName, StartPosition, Selected)
4273 SELECT DatabaseName, FileGroupName, StartPosition, Selected
4274 FROM FileGroups4
4275 OPTION (MAXRECURSION 0)
4276
4277 ----------------------------------------------------------------------------------------------------
4278 --// Select objects //--
4279 ----------------------------------------------------------------------------------------------------
4280
4281 SET @Objects = REPLACE(@Objects, CHAR(10), '')
4282 SET @Objects = REPLACE(@Objects, CHAR(13), '')
4283
4284 WHILE CHARINDEX(', ',@Objects) > 0 SET @Objects = REPLACE(@Objects,', ',',')
4285 WHILE CHARINDEX(' ,',@Objects) > 0 SET @Objects = REPLACE(@Objects,' ,',',')
4286
4287 SET @Objects = LTRIM(RTRIM(@Objects));
4288
4289 WITH Objects1 (StartPosition, EndPosition, ObjectItem) AS
4290 (
4291 SELECT 1 AS StartPosition,
4292 ISNULL(NULLIF(CHARINDEX(',', @Objects, 1), 0), LEN(@Objects) + 1) AS EndPosition,
4293 SUBSTRING(@Objects, 1, ISNULL(NULLIF(CHARINDEX(',', @Objects, 1), 0), LEN(@Objects) + 1) - 1) AS ObjectItem
4294 WHERE @Objects IS NOT NULL
4295 UNION ALL
4296 SELECT CAST(EndPosition AS int) + 1 AS StartPosition,
4297 ISNULL(NULLIF(CHARINDEX(',', @Objects, EndPosition + 1), 0), LEN(@Objects) + 1) AS EndPosition,
4298 SUBSTRING(@Objects, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(',', @Objects, EndPosition + 1), 0), LEN(@Objects) + 1) - EndPosition - 1) AS ObjectItem
4299 FROM Objects1
4300 WHERE EndPosition < LEN(@Objects) + 1
4301 ),
4302 Objects2 (ObjectItem, StartPosition, Selected) AS
4303 (
4304 SELECT CASE WHEN ObjectItem LIKE '-%' THEN RIGHT(ObjectItem,LEN(ObjectItem) - 1) ELSE ObjectItem END AS ObjectItem,
4305 StartPosition,
4306 CASE WHEN ObjectItem LIKE '-%' THEN 0 ELSE 1 END AS Selected
4307 FROM Objects1
4308 ),
4309 Objects3 (ObjectItem, StartPosition, Selected) AS
4310 (
4311 SELECT CASE WHEN ObjectItem = 'ALL_OBJECTS' THEN '%.%.%' ELSE ObjectItem END AS ObjectItem,
4312 StartPosition,
4313 Selected
4314 FROM Objects2
4315 ),
4316 Objects4 (DatabaseName, SchemaName, ObjectName, StartPosition, Selected) AS
4317 (
4318 SELECT CASE WHEN PARSENAME(ObjectItem,4) IS NULL THEN PARSENAME(ObjectItem,3) ELSE NULL END AS DatabaseName,
4319 CASE WHEN PARSENAME(ObjectItem,4) IS NULL THEN PARSENAME(ObjectItem,2) ELSE NULL END AS SchemaName,
4320 CASE WHEN PARSENAME(ObjectItem,4) IS NULL THEN PARSENAME(ObjectItem,1) ELSE NULL END AS ObjectName,
4321 StartPosition,
4322 Selected
4323 FROM Objects3
4324 )
4325 INSERT INTO @SelectedObjects (DatabaseName, SchemaName, ObjectName, StartPosition, Selected)
4326 SELECT DatabaseName, SchemaName, ObjectName, StartPosition, Selected
4327 FROM Objects4
4328 OPTION (MAXRECURSION 0);
4329
4330 ----------------------------------------------------------------------------------------------------
4331 --// Select check commands //--
4332 ----------------------------------------------------------------------------------------------------
4333
4334 WITH CheckCommands (StartPosition, EndPosition, CheckCommand) AS
4335 (
4336 SELECT 1 AS StartPosition,
4337 ISNULL(NULLIF(CHARINDEX(',', @CheckCommands, 1), 0), LEN(@CheckCommands) + 1) AS EndPosition,
4338 SUBSTRING(@CheckCommands, 1, ISNULL(NULLIF(CHARINDEX(',', @CheckCommands, 1), 0), LEN(@CheckCommands) + 1) - 1) AS CheckCommand
4339 WHERE @CheckCommands IS NOT NULL
4340 UNION ALL
4341 SELECT CAST(EndPosition AS int) + 1 AS StartPosition,
4342 ISNULL(NULLIF(CHARINDEX(',', @CheckCommands, EndPosition + 1), 0), LEN(@CheckCommands) + 1) AS EndPosition,
4343 SUBSTRING(@CheckCommands, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(',', @CheckCommands, EndPosition + 1), 0), LEN(@CheckCommands) + 1) - EndPosition - 1) AS CheckCommand
4344 FROM CheckCommands
4345 WHERE EndPosition < LEN(@CheckCommands) + 1
4346 )
4347 INSERT INTO @SelectedCheckCommands (CheckCommand)
4348 SELECT CheckCommand
4349 FROM CheckCommands
4350 OPTION (MAXRECURSION 0)
4351
4352 ----------------------------------------------------------------------------------------------------
4353 --// Check input parameters //--
4354 ----------------------------------------------------------------------------------------------------
4355
4356 IF EXISTS (SELECT * FROM @SelectedCheckCommands WHERE CheckCommand NOT IN('CHECKDB','CHECKFILEGROUP','CHECKALLOC','CHECKTABLE','CHECKCATALOG')) OR EXISTS (SELECT * FROM @SelectedCheckCommands GROUP BY CheckCommand HAVING COUNT(*) > 1) OR NOT EXISTS (SELECT * FROM @SelectedCheckCommands) OR (EXISTS (SELECT * FROM @SelectedCheckCommands WHERE CheckCommand IN('CHECKDB')) AND EXISTS (SELECT CheckCommand FROM @SelectedCheckCommands WHERE CheckCommand IN('CHECKFILEGROUP','CHECKALLOC','CHECKTABLE','CHECKCATALOG'))) OR (EXISTS (SELECT * FROM @SelectedCheckCommands WHERE CheckCommand IN('CHECKFILEGROUP')) AND EXISTS (SELECT CheckCommand FROM @SelectedCheckCommands WHERE CheckCommand IN('CHECKALLOC','CHECKTABLE')))
4357 BEGIN
4358 SET @ErrorMessage = 'The value for the parameter @CheckCommands is not supported.'
4359 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
4360 SET @Error = @@ERROR
4361 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
4362 END
4363
4364 IF @PhysicalOnly NOT IN ('Y','N') OR @PhysicalOnly IS NULL
4365 BEGIN
4366 SET @ErrorMessage = 'The value for the parameter @PhysicalOnly is not supported.'
4367 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
4368 SET @Error = @@ERROR
4369 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
4370 END
4371
4372 IF @NoIndex NOT IN ('Y','N') OR @NoIndex IS NULL
4373 BEGIN
4374 SET @ErrorMessage = 'The value for the parameter @NoIndex is not supported.'
4375 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
4376 SET @Error = @@ERROR
4377 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
4378 END
4379
4380 IF @ExtendedLogicalChecks NOT IN ('Y','N') OR @ExtendedLogicalChecks IS NULL OR (@ExtendedLogicalChecks = 'Y' AND NOT @Version >= 10) OR (@PhysicalOnly = 'Y' AND @ExtendedLogicalChecks = 'Y')
4381 BEGIN
4382 SET @ErrorMessage = 'The value for the parameter @ExtendedLogicalChecks is not supported.'
4383 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
4384 SET @Error = @@ERROR
4385 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
4386 END
4387
4388 IF @TabLock NOT IN ('Y','N') OR @TabLock IS NULL
4389 BEGIN
4390 SET @ErrorMessage = 'The value for the parameter @TabLock is not supported.'
4391 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
4392 SET @Error = @@ERROR
4393 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
4394 END
4395
4396 IF EXISTS(SELECT * FROM @SelectedFileGroups WHERE DatabaseName IS NULL OR FileGroupName IS NULL) OR (@FileGroups IS NOT NULL AND NOT EXISTS(SELECT * FROM @SelectedFileGroups)) OR (@FileGroups IS NOT NULL AND NOT EXISTS (SELECT * FROM @SelectedCheckCommands WHERE CheckCommand = 'CHECKFILEGROUP'))
4397 BEGIN
4398 SET @ErrorMessage = 'The value for the parameter @FileGroups is not supported.'
4399 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
4400 SET @Error = @@ERROR
4401 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
4402 END
4403
4404 IF EXISTS(SELECT * FROM @SelectedObjects WHERE DatabaseName IS NULL OR SchemaName IS NULL OR ObjectName IS NULL) OR (@Objects IS NOT NULL AND NOT EXISTS(SELECT * FROM @SelectedObjects)) OR (@Objects IS NOT NULL AND NOT EXISTS (SELECT * FROM @SelectedCheckCommands WHERE CheckCommand = 'CHECKTABLE'))
4405 BEGIN
4406 SET @ErrorMessage = 'The value for the parameter @Objects is not supported.'
4407 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
4408 SET @Error = @@ERROR
4409 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
4410 END
4411
4412 IF @MaxDOP < 0 OR @MaxDOP > 64 OR (@MaxDOP IS NOT NULL AND NOT (@Version >= 12.050000 OR SERVERPROPERTY('EngineEdition') IN (5, 8)))
4413 BEGIN
4414 SET @ErrorMessage = 'The value for the parameter @MaxDOP is not supported.'
4415 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
4416 SET @Error = @@ERROR
4417 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
4418 END
4419
4420 IF @AvailabilityGroupReplicas NOT IN('ALL','PRIMARY','SECONDARY','PREFERRED_BACKUP_REPLICA') OR @AvailabilityGroupReplicas IS NULL
4421 BEGIN
4422 SET @ErrorMessage = 'The value for the parameter @AvailabilityGroupReplicas is not supported.'
4423 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
4424 SET @Error = @@ERROR
4425 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
4426 END
4427
4428 IF @Updateability NOT IN('READ_ONLY','READ_WRITE','ALL') OR @Updateability IS NULL
4429 BEGIN
4430 SET @ErrorMessage = 'The value for the parameter @Updateability is not supported.'
4431 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
4432 SET @Error = @@ERROR
4433 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
4434 END
4435
4436 IF @TimeLimit < 0
4437 BEGIN
4438 SET @ErrorMessage = 'The value for the parameter @TimeLimit is not supported.'
4439 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
4440 SET @Error = @@ERROR
4441 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
4442 END
4443
4444 IF @LockTimeout < 0
4445 BEGIN
4446 SET @ErrorMessage = 'The value for the parameter @LockTimeout is not supported.'
4447 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
4448 SET @Error = @@ERROR
4449 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
4450 END
4451
4452 IF @LockMessageSeverity NOT IN(10,16)
4453 BEGIN
4454 SET @ErrorMessage = 'The value for the parameter @LockMessageSeverity is not supported.'
4455 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
4456 SET @Error = @@ERROR
4457 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
4458 END
4459
4460 IF @DatabaseOrder NOT IN('DATABASE_NAME_ASC','DATABASE_NAME_DESC','DATABASE_SIZE_ASC','DATABASE_SIZE_DESC','DATABASE_LAST_GOOD_CHECK_ASC','DATABASE_LAST_GOOD_CHECK_DESC','REPLICA_LAST_GOOD_CHECK_ASC','REPLICA_LAST_GOOD_CHECK_DESC') OR (@DatabaseOrder IN('DATABASE_LAST_GOOD_CHECK_ASC','DATABASE_LAST_GOOD_CHECK_DESC') AND NOT ((@Version >= 12.06024 AND @Version < 13) OR (@Version >= 13.05026 AND @Version < 14) OR @Version >= 14.0302916)) OR (@DatabaseOrder IN('REPLICA_LAST_GOOD_CHECK_ASC','REPLICA_LAST_GOOD_CHECK_DESC') AND @LogToTable = 'N') OR (@DatabaseOrder IN('DATABASE_LAST_GOOD_CHECK_ASC','DATABASE_LAST_GOOD_CHECK_DESC','REPLICA_LAST_GOOD_CHECK_ASC','REPLICA_LAST_GOOD_CHECK_DESC') AND @CheckCommands <> 'CHECKDB') OR (@DatabaseOrder IS NOT NULL AND SERVERPROPERTY('EngineEdition') = 5)
4461 BEGIN
4462 SET @ErrorMessage = 'The value for the parameter @DatabaseOrder is not supported.'
4463 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
4464 SET @Error = @@ERROR
4465 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
4466 END
4467
4468 IF @DatabasesInParallel NOT IN('Y','N') OR @DatabasesInParallel IS NULL OR (@DatabasesInParallel = 'Y' AND SERVERPROPERTY('EngineEdition') = 5)
4469 BEGIN
4470 SET @ErrorMessage = 'The value for the parameter @DatabasesInParallel is not supported.'
4471 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
4472 SET @Error = @@ERROR
4473 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
4474 END
4475
4476 IF @LogToTable NOT IN('Y','N') OR @LogToTable IS NULL
4477 BEGIN
4478 SET @ErrorMessage = 'The value for the parameter @LogToTable is not supported.'
4479 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
4480 SET @Error = @@ERROR
4481 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
4482 END
4483
4484 IF @Execute NOT IN('Y','N') OR @Execute IS NULL
4485 BEGIN
4486 SET @ErrorMessage = 'The value for the parameter @Execute is not supported.'
4487 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
4488 SET @Error = @@ERROR
4489 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
4490 END
4491
4492 IF @Error <> 0
4493 BEGIN
4494 SET @ErrorMessage = 'The documentation is available at https://ola.hallengren.com/sql-server-integrity-check.html.'
4495 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
4496 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
4497 SET @ReturnCode = @Error
4498 GOTO Logging
4499 END
4500
4501 ----------------------------------------------------------------------------------------------------
4502 --// Check that selected databases and availability groups exist //--
4503 ----------------------------------------------------------------------------------------------------
4504
4505 SET @ErrorMessage = ''
4506 SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + ', '
4507 FROM @SelectedDatabases
4508 WHERE DatabaseName NOT LIKE '%[%]%'
4509 AND DatabaseName NOT IN (SELECT DatabaseName FROM @tmpDatabases)
4510 IF @@ROWCOUNT > 0
4511 BEGIN
4512 SET @ErrorMessage = 'The following databases in the @Databases parameter do not exist: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.'
4513 RAISERROR('%s',10,1,@ErrorMessage) WITH NOWAIT
4514 SET @Error = @@ERROR
4515 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
4516 END
4517
4518 SET @ErrorMessage = ''
4519 SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + ', '
4520 FROM @SelectedFileGroups
4521 WHERE DatabaseName NOT LIKE '%[%]%'
4522 AND DatabaseName NOT IN (SELECT DatabaseName FROM @tmpDatabases)
4523 IF @@ROWCOUNT > 0
4524 BEGIN
4525 SET @ErrorMessage = 'The following databases in the @FileGroups parameter do not exist: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.'
4526 RAISERROR('%s',10,1,@ErrorMessage) WITH NOWAIT
4527 SET @Error = @@ERROR
4528 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
4529 END
4530
4531 SET @ErrorMessage = ''
4532 SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + ', '
4533 FROM @SelectedObjects
4534 WHERE DatabaseName NOT LIKE '%[%]%'
4535 AND DatabaseName NOT IN (SELECT DatabaseName FROM @tmpDatabases)
4536 IF @@ROWCOUNT > 0
4537 BEGIN
4538 SET @ErrorMessage = 'The following databases in the @Objects parameter do not exist: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.'
4539 RAISERROR('%s',10,1,@ErrorMessage) WITH NOWAIT
4540 SET @Error = @@ERROR
4541 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
4542 END
4543
4544 SET @ErrorMessage = ''
4545 SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(AvailabilityGroupName) + ', '
4546 FROM @SelectedAvailabilityGroups
4547 WHERE AvailabilityGroupName NOT LIKE '%[%]%'
4548 AND AvailabilityGroupName NOT IN (SELECT AvailabilityGroupName FROM @tmpAvailabilityGroups)
4549 IF @@ROWCOUNT > 0
4550 BEGIN
4551 SET @ErrorMessage = 'The following availability groups do not exist: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.'
4552 RAISERROR('%s',10,1,@ErrorMessage) WITH NOWAIT
4553 SET @Error = @@ERROR
4554 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
4555 END
4556
4557 SET @ErrorMessage = ''
4558 SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + ', '
4559 FROM @SelectedFileGroups
4560 WHERE DatabaseName NOT LIKE '%[%]%'
4561 AND DatabaseName IN (SELECT DatabaseName FROM @tmpDatabases)
4562 AND DatabaseName NOT IN (SELECT DatabaseName FROM @tmpDatabases WHERE Selected = 1)
4563 IF @@ROWCOUNT > 0
4564 BEGIN
4565 SET @ErrorMessage = 'The following databases have been selected in the @FileGroups parameter, but not in the @Databases or @AvailabilityGroups parameters: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.'
4566 RAISERROR('%s',10,1,@ErrorMessage) WITH NOWAIT
4567 SET @Error = @@ERROR
4568 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
4569 END
4570
4571 SET @ErrorMessage = ''
4572 SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + ', '
4573 FROM @SelectedObjects
4574 WHERE DatabaseName NOT LIKE '%[%]%'
4575 AND DatabaseName IN (SELECT DatabaseName FROM @tmpDatabases)
4576 AND DatabaseName NOT IN (SELECT DatabaseName FROM @tmpDatabases WHERE Selected = 1)
4577 IF @@ROWCOUNT > 0
4578 BEGIN
4579 SET @ErrorMessage = 'The following databases have been selected in the @Objects parameter, but not in the @Databases or @AvailabilityGroups parameters: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.'
4580 RAISERROR('%s',10,1,@ErrorMessage) WITH NOWAIT
4581 SET @Error = @@ERROR
4582 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
4583 END
4584
4585 ----------------------------------------------------------------------------------------------------
4586 --// Check @@SERVERNAME //--
4587 ----------------------------------------------------------------------------------------------------
4588
4589 IF @@SERVERNAME <> CAST(SERVERPROPERTY('ServerName') AS nvarchar(max)) AND SERVERPROPERTY('IsHadrEnabled') = 1
4590 BEGIN
4591 SET @ErrorMessage = 'The @@SERVERNAME does not match SERVERPROPERTY(''ServerName''). See ' + CASE WHEN SERVERPROPERTY('IsClustered') = 0 THEN 'https://docs.microsoft.com/en-us/sql/database-engine/install-windows/rename-a-computer-that-hosts-a-stand-alone-instance-of-sql-server' WHEN SERVERPROPERTY('IsClustered') = 1 THEN 'https://docs.microsoft.com/en-us/sql/sql-server/failover-clusters/install/rename-a-sql-server-failover-cluster-instance' END + '.'
4592 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
4593 SET @Error = @@ERROR
4594 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
4595 END
4596
4597 ----------------------------------------------------------------------------------------------------
4598 --// Update database order //--
4599 ----------------------------------------------------------------------------------------------------
4600
4601 IF @DatabaseOrder IN('DATABASE_SIZE_ASC','DATABASE_SIZE_DESC')
4602 BEGIN
4603 UPDATE tmpDatabases
4604 SET DatabaseSize = (SELECT SUM(size) FROM sys.master_files WHERE [type] = 0 AND database_id = DB_ID(tmpDatabases.DatabaseName))
4605 FROM @tmpDatabases tmpDatabases
4606 END
4607
4608 IF @DatabaseOrder IN('DATABASE_LAST_GOOD_CHECK_ASC','DATABASE_LAST_GOOD_CHECK_DESC')
4609 BEGIN
4610 UPDATE tmpDatabases
4611 SET LastGoodCheckDbTime = NULLIF(CAST(DATABASEPROPERTYEX (DatabaseName,'LastGoodCheckDbTime') AS datetime),'1900-01-01 00:00:00.000')
4612 FROM @tmpDatabases tmpDatabases
4613 END
4614
4615 IF @DatabaseOrder IN('REPLICA_LAST_GOOD_CHECK_ASC','REPLICA_LAST_GOOD_CHECK_DESC')
4616 BEGIN
4617 UPDATE tmpDatabases
4618 SET LastCommandTime = MaxStartTime
4619 FROM @tmpDatabases tmpDatabases
4620 INNER JOIN (SELECT DatabaseName, MAX(StartTime) AS MaxStartTime
4621 FROM dbo.CommandLog
4622 WHERE CommandType = 'DBCC_CHECKDB'
4623 AND ErrorNumber = 0
4624 GROUP BY DatabaseName) CommandLog
4625 ON tmpDatabases.DatabaseName = CommandLog.DatabaseName COLLATE DATABASE_DEFAULT
4626 END
4627
4628 IF @DatabaseOrder IS NULL
4629 BEGIN
4630 WITH tmpDatabases AS (
4631 SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY StartPosition ASC, DatabaseName ASC) AS RowNumber
4632 FROM @tmpDatabases tmpDatabases
4633 WHERE Selected = 1
4634 )
4635 UPDATE tmpDatabases
4636 SET [Order] = RowNumber
4637 END
4638 ELSE
4639 IF @DatabaseOrder = 'DATABASE_NAME_ASC'
4640 BEGIN
4641 WITH tmpDatabases AS (
4642 SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY DatabaseName ASC) AS RowNumber
4643 FROM @tmpDatabases tmpDatabases
4644 WHERE Selected = 1
4645 )
4646 UPDATE tmpDatabases
4647 SET [Order] = RowNumber
4648 END
4649 ELSE
4650 IF @DatabaseOrder = 'DATABASE_NAME_DESC'
4651 BEGIN
4652 WITH tmpDatabases AS (
4653 SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY DatabaseName DESC) AS RowNumber
4654 FROM @tmpDatabases tmpDatabases
4655 WHERE Selected = 1
4656 )
4657 UPDATE tmpDatabases
4658 SET [Order] = RowNumber
4659 END
4660 ELSE
4661 IF @DatabaseOrder = 'DATABASE_SIZE_ASC'
4662 BEGIN
4663 WITH tmpDatabases AS (
4664 SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY DatabaseSize ASC) AS RowNumber
4665 FROM @tmpDatabases tmpDatabases
4666 WHERE Selected = 1
4667 )
4668 UPDATE tmpDatabases
4669 SET [Order] = RowNumber
4670 END
4671 ELSE
4672 IF @DatabaseOrder = 'DATABASE_SIZE_DESC'
4673 BEGIN
4674 WITH tmpDatabases AS (
4675 SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY DatabaseSize DESC) AS RowNumber
4676 FROM @tmpDatabases tmpDatabases
4677 WHERE Selected = 1
4678 )
4679 UPDATE tmpDatabases
4680 SET [Order] = RowNumber
4681 END
4682 ELSE
4683 IF @DatabaseOrder = 'DATABASE_LAST_GOOD_CHECK_ASC'
4684 BEGIN
4685 WITH tmpDatabases AS (
4686 SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY LastGoodCheckDbTime ASC) AS RowNumber
4687 FROM @tmpDatabases tmpDatabases
4688 WHERE Selected = 1
4689 )
4690 UPDATE tmpDatabases
4691 SET [Order] = RowNumber
4692 END
4693 ELSE
4694 IF @DatabaseOrder = 'DATABASE_LAST_GOOD_CHECK_DESC'
4695 BEGIN
4696 WITH tmpDatabases AS (
4697 SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY LastGoodCheckDbTime DESC) AS RowNumber
4698 FROM @tmpDatabases tmpDatabases
4699 WHERE Selected = 1
4700 )
4701 UPDATE tmpDatabases
4702 SET [Order] = RowNumber
4703 END
4704 ELSE
4705 IF @DatabaseOrder = 'REPLICA_LAST_GOOD_CHECK_ASC'
4706 BEGIN
4707 WITH tmpDatabases AS (
4708 SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY LastCommandTime ASC) AS RowNumber
4709 FROM @tmpDatabases tmpDatabases
4710 WHERE Selected = 1
4711 )
4712 UPDATE tmpDatabases
4713 SET [Order] = RowNumber
4714 END
4715 ELSE
4716 IF @DatabaseOrder = 'REPLICA_LAST_GOOD_CHECK_DESC'
4717 BEGIN
4718 WITH tmpDatabases AS (
4719 SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY LastCommandTime DESC) AS RowNumber
4720 FROM @tmpDatabases tmpDatabases
4721 WHERE Selected = 1
4722 )
4723 UPDATE tmpDatabases
4724 SET [Order] = RowNumber
4725 END
4726
4727 ----------------------------------------------------------------------------------------------------
4728 --// Update the queue //--
4729 ----------------------------------------------------------------------------------------------------
4730
4731 IF @DatabasesInParallel = 'Y'
4732 BEGIN
4733
4734 BEGIN TRY
4735
4736 SELECT @QueueID = QueueID
4737 FROM dbo.[Queue]
4738 WHERE SchemaName = @SchemaName
4739 AND ObjectName = @ObjectName
4740 AND [Parameters] = @Parameters
4741
4742 IF @QueueID IS NULL
4743 BEGIN
4744 BEGIN TRANSACTION
4745
4746 SELECT @QueueID = QueueID
4747 FROM dbo.[Queue] WITH (UPDLOCK, TABLOCK)
4748 WHERE SchemaName = @SchemaName
4749 AND ObjectName = @ObjectName
4750 AND [Parameters] = @Parameters
4751
4752 IF @QueueID IS NULL
4753 BEGIN
4754 INSERT INTO dbo.[Queue] (SchemaName, ObjectName, [Parameters])
4755 SELECT @SchemaName, @ObjectName, @Parameters
4756
4757 SET @QueueID = SCOPE_IDENTITY()
4758 END
4759
4760 COMMIT TRANSACTION
4761 END
4762
4763 BEGIN TRANSACTION
4764
4765 UPDATE [Queue]
4766 SET QueueStartTime = GETDATE(),
4767 SessionID = @@SPID,
4768 RequestID = (SELECT request_id FROM sys.dm_exec_requests WHERE session_id = @@SPID),
4769 RequestStartTime = (SELECT start_time FROM sys.dm_exec_requests WHERE session_id = @@SPID)
4770 FROM dbo.[Queue] [Queue]
4771 WHERE QueueID = @QueueID
4772 AND NOT EXISTS (SELECT *
4773 FROM sys.dm_exec_requests
4774 WHERE session_id = [Queue].SessionID
4775 AND request_id = [Queue].RequestID
4776 AND start_time = [Queue].RequestStartTime)
4777 AND NOT EXISTS (SELECT *
4778 FROM dbo.QueueDatabase QueueDatabase
4779 INNER JOIN sys.dm_exec_requests ON QueueDatabase.SessionID = session_id AND QueueDatabase.RequestID = request_id AND QueueDatabase.RequestStartTime = start_time
4780 WHERE QueueDatabase.QueueID = @QueueID)
4781
4782 IF @@ROWCOUNT = 1
4783 BEGIN
4784 INSERT INTO dbo.QueueDatabase (QueueID, DatabaseName)
4785 SELECT @QueueID AS QueueID,
4786 DatabaseName
4787 FROM @tmpDatabases tmpDatabases
4788 WHERE Selected = 1
4789 AND NOT EXISTS (SELECT * FROM dbo.QueueDatabase WHERE DatabaseName = tmpDatabases.DatabaseName AND QueueID = @QueueID)
4790
4791 DELETE QueueDatabase
4792 FROM dbo.QueueDatabase QueueDatabase
4793 WHERE QueueID = @QueueID
4794 AND NOT EXISTS (SELECT * FROM @tmpDatabases tmpDatabases WHERE DatabaseName = QueueDatabase.DatabaseName AND Selected = 1)
4795
4796 UPDATE QueueDatabase
4797 SET DatabaseOrder = tmpDatabases.[Order]
4798 FROM dbo.QueueDatabase QueueDatabase
4799 INNER JOIN @tmpDatabases tmpDatabases ON QueueDatabase.DatabaseName = tmpDatabases.DatabaseName
4800 WHERE QueueID = @QueueID
4801 END
4802
4803 COMMIT TRANSACTION
4804
4805 SELECT @QueueStartTime = QueueStartTime
4806 FROM dbo.[Queue]
4807 WHERE QueueID = @QueueID
4808
4809 END TRY
4810
4811 BEGIN CATCH
4812 IF XACT_STATE() <> 0
4813 BEGIN
4814 ROLLBACK TRANSACTION
4815 END
4816 SET @ErrorMessage = 'Msg ' + CAST(ERROR_NUMBER() AS nvarchar) + ', ' + ISNULL(ERROR_MESSAGE(),'')
4817 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
4818 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
4819 SET @ReturnCode = ERROR_NUMBER()
4820 GOTO Logging
4821 END CATCH
4822
4823 END
4824
4825 ----------------------------------------------------------------------------------------------------
4826 --// Execute commands //--
4827 ----------------------------------------------------------------------------------------------------
4828
4829 WHILE (1 = 1)
4830 BEGIN
4831
4832 IF @DatabasesInParallel = 'Y'
4833 BEGIN
4834 UPDATE QueueDatabase
4835 SET DatabaseStartTime = NULL,
4836 SessionID = NULL,
4837 RequestID = NULL,
4838 RequestStartTime = NULL
4839 FROM dbo.QueueDatabase QueueDatabase
4840 WHERE QueueID = @QueueID
4841 AND DatabaseStartTime IS NOT NULL
4842 AND DatabaseEndTime IS NULL
4843 AND NOT EXISTS (SELECT * FROM sys.dm_exec_requests WHERE session_id = QueueDatabase.SessionID AND request_id = QueueDatabase.RequestID AND start_time = QueueDatabase.RequestStartTime)
4844
4845 UPDATE QueueDatabase
4846 SET DatabaseStartTime = GETDATE(),
4847 DatabaseEndTime = NULL,
4848 SessionID = @@SPID,
4849 RequestID = (SELECT request_id FROM sys.dm_exec_requests WHERE session_id = @@SPID),
4850 RequestStartTime = (SELECT start_time FROM sys.dm_exec_requests WHERE session_id = @@SPID),
4851 @CurrentDatabaseName = DatabaseName
4852 FROM (SELECT TOP 1 DatabaseStartTime,
4853 DatabaseEndTime,
4854 SessionID,
4855 RequestID,
4856 RequestStartTime,
4857 DatabaseName
4858 FROM dbo.QueueDatabase
4859 WHERE QueueID = @QueueID
4860 AND (DatabaseStartTime < @QueueStartTime OR DatabaseStartTime IS NULL)
4861 AND NOT (DatabaseStartTime IS NOT NULL AND DatabaseEndTime IS NULL)
4862 ORDER BY DatabaseOrder ASC
4863 ) QueueDatabase
4864 END
4865 ELSE
4866 BEGIN
4867 SELECT TOP 1 @CurrentDBID = ID,
4868 @CurrentDatabaseName = DatabaseName
4869 FROM @tmpDatabases
4870 WHERE Selected = 1
4871 AND Completed = 0
4872 ORDER BY [Order] ASC
4873 END
4874
4875 IF @@ROWCOUNT = 0
4876 BEGIN
4877 BREAK
4878 END
4879
4880 SET @CurrentDatabaseID = DB_ID(@CurrentDatabaseName)
4881
4882 IF DATABASEPROPERTYEX(@CurrentDatabaseName,'Status') = 'ONLINE' AND SERVERPROPERTY('EngineEdition') <> 5
4883 BEGIN
4884 IF EXISTS (SELECT * FROM sys.database_recovery_status WHERE database_id = @CurrentDatabaseID AND database_guid IS NOT NULL)
4885 BEGIN
4886 SET @CurrentIsDatabaseAccessible = 1
4887 END
4888 ELSE
4889 BEGIN
4890 SET @CurrentIsDatabaseAccessible = 0
4891 END
4892 END
4893
4894 IF @Version >= 11 AND SERVERPROPERTY('IsHadrEnabled') = 1
4895 BEGIN
4896 SELECT @CurrentAvailabilityGroup = availability_groups.name,
4897 @CurrentAvailabilityGroupRole = dm_hadr_availability_replica_states.role_desc,
4898 @CurrentAvailabilityGroupBackupPreference = UPPER(availability_groups.automated_backup_preference_desc)
4899 FROM sys.databases databases
4900 INNER JOIN sys.dm_hadr_availability_replica_states dm_hadr_availability_replica_states ON databases.replica_id = dm_hadr_availability_replica_states.replica_id
4901 INNER JOIN sys.availability_groups availability_groups ON dm_hadr_availability_replica_states.group_id = availability_groups.group_id
4902 WHERE databases.name = @CurrentDatabaseName
4903 END
4904
4905 IF @Version >= 11 AND SERVERPROPERTY('IsHadrEnabled') = 1 AND @CurrentAvailabilityGroup IS NOT NULL AND @AvailabilityGroupReplicas = 'PREFERRED_BACKUP_REPLICA'
4906 BEGIN
4907 SELECT @CurrentIsPreferredBackupReplica = sys.fn_hadr_backup_is_preferred_replica(@CurrentDatabaseName)
4908 END
4909
4910 IF SERVERPROPERTY('EngineEdition') <> 5
4911 BEGIN
4912 SELECT @CurrentDatabaseMirroringRole = UPPER(mirroring_role_desc)
4913 FROM sys.database_mirroring
4914 WHERE database_id = @CurrentDatabaseID
4915 END
4916
4917 SELECT @CurrentIsReadOnly = is_read_only
4918 FROM sys.databases
4919 WHERE name = @CurrentDatabaseName
4920
4921 SET @DatabaseMessage = 'Date and time: ' + CONVERT(nvarchar,GETDATE(),120)
4922 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
4923
4924 SET @DatabaseMessage = 'Database: ' + QUOTENAME(@CurrentDatabaseName)
4925 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
4926
4927 SET @DatabaseMessage = 'Status: ' + CAST(DATABASEPROPERTYEX(@CurrentDatabaseName,'Status') AS nvarchar)
4928 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
4929
4930 SET @DatabaseMessage = 'Standby: ' + CASE WHEN DATABASEPROPERTYEX(@CurrentDatabaseName,'IsInStandBy') = 1 THEN 'Yes' ELSE 'No' END
4931 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
4932
4933 SET @DatabaseMessage = 'Updateability: ' + CASE WHEN @CurrentIsReadOnly = 1 THEN 'READ_ONLY' WHEN @CurrentIsReadOnly = 0 THEN 'READ_WRITE' END
4934 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
4935
4936 SET @DatabaseMessage = 'User access: ' + CAST(DATABASEPROPERTYEX(@CurrentDatabaseName,'UserAccess') AS nvarchar)
4937 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
4938
4939 IF @CurrentIsDatabaseAccessible IS NOT NULL
4940 BEGIN
4941 SET @DatabaseMessage = 'Is accessible: ' + CASE WHEN @CurrentIsDatabaseAccessible = 1 THEN 'Yes' ELSE 'No' END
4942 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
4943 END
4944
4945 SET @DatabaseMessage = 'Recovery model: ' + CAST(DATABASEPROPERTYEX(@CurrentDatabaseName,'Recovery') AS nvarchar)
4946 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
4947
4948 IF @CurrentAvailabilityGroup IS NOT NULL
4949 BEGIN
4950 SET @DatabaseMessage = 'Availability group: ' + ISNULL(@CurrentAvailabilityGroup,'N/A')
4951 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
4952
4953 SET @DatabaseMessage = 'Availability group role: ' + ISNULL(@CurrentAvailabilityGroupRole,'N/A')
4954 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
4955
4956 IF @AvailabilityGroupReplicas = 'PREFERRED_BACKUP_REPLICA'
4957 BEGIN
4958 SET @DatabaseMessage = 'Availability group backup preference: ' + ISNULL(@CurrentAvailabilityGroupBackupPreference,'N/A')
4959 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
4960
4961 SET @DatabaseMessage = 'Is preferred backup replica: ' + CASE WHEN @CurrentIsPreferredBackupReplica = 1 THEN 'Yes' WHEN @CurrentIsPreferredBackupReplica = 0 THEN 'No' ELSE 'N/A' END
4962 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
4963 END
4964 END
4965
4966 IF @CurrentDatabaseMirroringRole IS NOT NULL
4967 BEGIN
4968 SET @DatabaseMessage = 'Database mirroring role: ' + @CurrentDatabaseMirroringRole
4969 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
4970 END
4971
4972 RAISERROR('',10,1) WITH NOWAIT
4973
4974 IF DATABASEPROPERTYEX(@CurrentDatabaseName,'Status') = 'ONLINE'
4975 AND (@CurrentIsDatabaseAccessible = 1 OR @CurrentIsDatabaseAccessible IS NULL)
4976 AND (@CurrentAvailabilityGroupRole = 'PRIMARY' OR @CurrentAvailabilityGroupRole IS NULL OR SERVERPROPERTY('EngineEdition') = 3)
4977 AND ((@AvailabilityGroupReplicas = 'PRIMARY' AND @CurrentAvailabilityGroupRole = 'PRIMARY') OR (@AvailabilityGroupReplicas = 'SECONDARY' AND @CurrentAvailabilityGroupRole = 'SECONDARY') OR (@AvailabilityGroupReplicas = 'PREFERRED_BACKUP_REPLICA' AND @CurrentIsPreferredBackupReplica = 1) OR @AvailabilityGroupReplicas = 'ALL' OR @CurrentAvailabilityGroupRole IS NULL)
4978 AND NOT (@CurrentIsReadOnly = 1 AND @Updateability = 'READ_WRITE')
4979 AND NOT (@CurrentIsReadOnly = 0 AND @Updateability = 'READ_ONLY')
4980 BEGIN
4981
4982 -- Check database
4983 IF EXISTS(SELECT * FROM @SelectedCheckCommands WHERE CheckCommand = 'CHECKDB') AND (GETDATE() < DATEADD(ss,@TimeLimit,@StartTime) OR @TimeLimit IS NULL)
4984 BEGIN
4985 SET @CurrentCommandType01 = 'DBCC_CHECKDB'
4986
4987 SET @CurrentCommand01 = ''
4988 IF @LockTimeout IS NOT NULL SET @CurrentCommand01 = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; '
4989 SET @CurrentCommand01 = @CurrentCommand01 + 'DBCC CHECKDB (' + QUOTENAME(@CurrentDatabaseName)
4990 IF @NoIndex = 'Y' SET @CurrentCommand01 = @CurrentCommand01 + ', NOINDEX'
4991 SET @CurrentCommand01 = @CurrentCommand01 + ') WITH NO_INFOMSGS, ALL_ERRORMSGS'
4992 IF @PhysicalOnly = 'N' SET @CurrentCommand01 = @CurrentCommand01 + ', DATA_PURITY'
4993 IF @PhysicalOnly = 'Y' SET @CurrentCommand01 = @CurrentCommand01 + ', PHYSICAL_ONLY'
4994 IF @ExtendedLogicalChecks = 'Y' SET @CurrentCommand01 = @CurrentCommand01 + ', EXTENDED_LOGICAL_CHECKS'
4995 IF @TabLock = 'Y' SET @CurrentCommand01 = @CurrentCommand01 + ', TABLOCK'
4996 IF @MaxDOP IS NOT NULL SET @CurrentCommand01 = @CurrentCommand01 + ', MAXDOP = ' + CAST(@MaxDOP AS nvarchar)
4997
4998 EXECUTE @CurrentCommandOutput01 = [dbo].[CommandExecute] @Command = @CurrentCommand01, @CommandType = @CurrentCommandType01, @Mode = 1, @DatabaseName = @CurrentDatabaseName, @LogToTable = @LogToTable, @Execute = @Execute
4999 SET @Error = @@ERROR
5000 IF @Error <> 0 SET @CurrentCommandOutput01 = @Error
5001 IF @CurrentCommandOutput01 <> 0 SET @ReturnCode = @CurrentCommandOutput01
5002 END
5003
5004 -- Check filegroups
5005 IF EXISTS(SELECT * FROM @SelectedCheckCommands WHERE CheckCommand = 'CHECKFILEGROUP') AND (GETDATE() < DATEADD(ss,@TimeLimit,@StartTime) OR @TimeLimit IS NULL)
5006 BEGIN
5007 SET @CurrentCommand02 = 'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SELECT data_space_id AS FileGroupID, name AS FileGroupName, 0 AS [Order], 0 AS Selected, 0 AS Completed FROM ' + QUOTENAME(@CurrentDatabaseName) + '.sys.filegroups filegroups WHERE [type] <> ''FX'' ORDER BY CASE WHEN filegroups.name = ''PRIMARY'' THEN 1 ELSE 0 END DESC, filegroups.name ASC'
5008
5009 INSERT INTO @tmpFileGroups (FileGroupID, FileGroupName, [Order], Selected, Completed)
5010 EXECUTE sp_executesql @statement = @CurrentCommand02
5011 SET @Error = @@ERROR
5012 IF @Error <> 0 SET @ReturnCode = @Error
5013
5014 IF @FileGroups IS NULL
5015 BEGIN
5016 UPDATE tmpFileGroups
5017 SET tmpFileGroups.Selected = 1
5018 FROM @tmpFileGroups tmpFileGroups
5019 END
5020 ELSE
5021 BEGIN
5022 UPDATE tmpFileGroups
5023 SET tmpFileGroups.Selected = SelectedFileGroups.Selected
5024 FROM @tmpFileGroups tmpFileGroups
5025 INNER JOIN @SelectedFileGroups SelectedFileGroups
5026 ON @CurrentDatabaseName LIKE REPLACE(SelectedFileGroups.DatabaseName,'_','[_]') AND tmpFileGroups.FileGroupName LIKE REPLACE(SelectedFileGroups.FileGroupName,'_','[_]')
5027 WHERE SelectedFileGroups.Selected = 1
5028
5029 UPDATE tmpFileGroups
5030 SET tmpFileGroups.Selected = SelectedFileGroups.Selected
5031 FROM @tmpFileGroups tmpFileGroups
5032 INNER JOIN @SelectedFileGroups SelectedFileGroups
5033 ON @CurrentDatabaseName LIKE REPLACE(SelectedFileGroups.DatabaseName,'_','[_]') AND tmpFileGroups.FileGroupName LIKE REPLACE(SelectedFileGroups.FileGroupName,'_','[_]')
5034 WHERE SelectedFileGroups.Selected = 0
5035
5036 UPDATE tmpFileGroups
5037 SET tmpFileGroups.StartPosition = SelectedFileGroups2.StartPosition
5038 FROM @tmpFileGroups tmpFileGroups
5039 INNER JOIN (SELECT tmpFileGroups.FileGroupName, MIN(SelectedFileGroups.StartPosition) AS StartPosition
5040 FROM @tmpFileGroups tmpFileGroups
5041 INNER JOIN @SelectedFileGroups SelectedFileGroups
5042 ON @CurrentDatabaseName LIKE REPLACE(SelectedFileGroups.DatabaseName,'_','[_]') AND tmpFileGroups.FileGroupName LIKE REPLACE(SelectedFileGroups.FileGroupName,'_','[_]')
5043 WHERE SelectedFileGroups.Selected = 1
5044 GROUP BY tmpFileGroups.FileGroupName) SelectedFileGroups2
5045 ON tmpFileGroups.FileGroupName = SelectedFileGroups2.FileGroupName
5046 END;
5047
5048 WITH tmpFileGroups AS (
5049 SELECT FileGroupName, [Order], ROW_NUMBER() OVER (ORDER BY StartPosition ASC, FileGroupName ASC) AS RowNumber
5050 FROM @tmpFileGroups tmpFileGroups
5051 WHERE Selected = 1
5052 )
5053 UPDATE tmpFileGroups
5054 SET [Order] = RowNumber
5055
5056 SET @ErrorMessage = ''
5057 SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + '.' + QUOTENAME(FileGroupName) + ', '
5058 FROM @SelectedFileGroups SelectedFileGroups
5059 WHERE DatabaseName = @CurrentDatabaseName
5060 AND FileGroupName NOT LIKE '%[%]%'
5061 AND NOT EXISTS (SELECT * FROM @tmpFileGroups WHERE FileGroupName = SelectedFileGroups.FileGroupName)
5062 IF @@ROWCOUNT > 0
5063 BEGIN
5064 SET @ErrorMessage = 'The following file groups do not exist: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.'
5065 RAISERROR('%s',10,1,@ErrorMessage) WITH NOWAIT
5066 SET @Error = @@ERROR
5067 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
5068 END
5069
5070 WHILE (GETDATE() < DATEADD(ss,@TimeLimit,@StartTime) OR @TimeLimit IS NULL)
5071 BEGIN
5072 SELECT TOP 1 @CurrentFGID = ID,
5073 @CurrentFileGroupID = FileGroupID,
5074 @CurrentFileGroupName = FileGroupName
5075 FROM @tmpFileGroups
5076 WHERE Selected = 1
5077 AND Completed = 0
5078 ORDER BY [Order] ASC
5079
5080 IF @@ROWCOUNT = 0
5081 BEGIN
5082 BREAK
5083 END
5084
5085 -- Does the filegroup exist?
5086 SET @CurrentCommand03 = ''
5087 IF @LockTimeout IS NOT NULL SET @CurrentCommand03 = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; '
5088 SET @CurrentCommand03 = @CurrentCommand03 + 'IF EXISTS(SELECT * FROM ' + QUOTENAME(@CurrentDatabaseName) + '.sys.filegroups filegroups WHERE [type] <> ''FX'' AND filegroups.data_space_id = @ParamFileGroupID AND filegroups.[name] = @ParamFileGroupName) BEGIN SET @ParamFileGroupExists = 1 END'
5089
5090 BEGIN TRY
5091 EXECUTE sp_executesql @statement = @CurrentCommand03, @params = N'@ParamFileGroupID int, @ParamFileGroupName sysname, @ParamFileGroupExists bit OUTPUT', @ParamFileGroupID = @CurrentFileGroupID, @ParamFileGroupName = @CurrentFileGroupName, @ParamFileGroupExists = @CurrentFileGroupExists OUTPUT
5092
5093 IF @CurrentFileGroupExists IS NULL SET @CurrentFileGroupExists = 0
5094 END TRY
5095 BEGIN CATCH
5096 SET @ErrorMessage = 'Msg ' + CAST(ERROR_NUMBER() AS nvarchar) + ', ' + ISNULL(ERROR_MESSAGE(),'') + CASE WHEN ERROR_NUMBER() = 1222 THEN ', ' + ' The file group ' + QUOTENAME(@CurrentFileGroupName) + ' in the database ' + QUOTENAME(@CurrentDatabaseName) + ' is locked. It could not be checked if the filegroup exists.' ELSE '' END
5097 SET @Severity = CASE WHEN ERROR_NUMBER() IN(1205,1222) THEN @LockMessageSeverity ELSE 16 END
5098 RAISERROR('%s',@Severity,1,@ErrorMessage) WITH NOWAIT
5099 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
5100
5101 IF NOT (ERROR_NUMBER() IN(1205,1222) AND @LockMessageSeverity = 10)
5102 BEGIN
5103 SET @ReturnCode = ERROR_NUMBER()
5104 END
5105 END CATCH
5106
5107 IF @CurrentFileGroupExists = 1
5108 BEGIN
5109 SET @CurrentCommandType04 = 'DBCC_CHECKFILEGROUP'
5110
5111 SET @CurrentCommand04 = ''
5112 IF @LockTimeout IS NOT NULL SET @CurrentCommand04 = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; '
5113 SET @CurrentCommand04 = @CurrentCommand04 + 'USE ' + QUOTENAME(@CurrentDatabaseName) + '; DBCC CHECKFILEGROUP (' + QUOTENAME(@CurrentFileGroupName)
5114 IF @NoIndex = 'Y' SET @CurrentCommand04 = @CurrentCommand04 + ', NOINDEX'
5115 SET @CurrentCommand04 = @CurrentCommand04 + ') WITH NO_INFOMSGS, ALL_ERRORMSGS'
5116 IF @PhysicalOnly = 'Y' SET @CurrentCommand04 = @CurrentCommand04 + ', PHYSICAL_ONLY'
5117 IF @TabLock = 'Y' SET @CurrentCommand04 = @CurrentCommand04 + ', TABLOCK'
5118 IF @MaxDOP IS NOT NULL SET @CurrentCommand04 = @CurrentCommand04 + ', MAXDOP = ' + CAST(@MaxDOP AS nvarchar)
5119
5120 EXECUTE @CurrentCommandOutput04 = [dbo].[CommandExecute] @Command = @CurrentCommand04, @CommandType = @CurrentCommandType04, @Mode = 1, @DatabaseName = @CurrentDatabaseName, @LogToTable = @LogToTable, @Execute = @Execute
5121 SET @Error = @@ERROR
5122 IF @Error <> 0 SET @CurrentCommandOutput04 = @Error
5123 IF @CurrentCommandOutput04 <> 0 SET @ReturnCode = @CurrentCommandOutput04
5124 END
5125
5126 UPDATE @tmpFileGroups
5127 SET Completed = 1
5128 WHERE Selected = 1
5129 AND Completed = 0
5130 AND ID = @CurrentFGID
5131
5132 SET @CurrentFGID = NULL
5133 SET @CurrentFileGroupID = NULL
5134 SET @CurrentFileGroupName = NULL
5135 SET @CurrentFileGroupExists = NULL
5136
5137 SET @CurrentCommand03 = NULL
5138 SET @CurrentCommand04 = NULL
5139
5140 SET @CurrentCommandOutput04 = NULL
5141
5142 SET @CurrentCommandType04 = NULL
5143 END
5144 END
5145
5146 -- Check disk space allocation structures
5147 IF EXISTS(SELECT * FROM @SelectedCheckCommands WHERE CheckCommand = 'CHECKALLOC') AND (GETDATE() < DATEADD(ss,@TimeLimit,@StartTime) OR @TimeLimit IS NULL)
5148 BEGIN
5149 SET @CurrentCommandType05 = 'DBCC_CHECKALLOC'
5150
5151 SET @CurrentCommand05 = ''
5152 IF @LockTimeout IS NOT NULL SET @CurrentCommand05 = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; '
5153 SET @CurrentCommand05 = @CurrentCommand05 + 'DBCC CHECKALLOC (' + QUOTENAME(@CurrentDatabaseName)
5154 SET @CurrentCommand05 = @CurrentCommand05 + ') WITH NO_INFOMSGS, ALL_ERRORMSGS'
5155 IF @TabLock = 'Y' SET @CurrentCommand05 = @CurrentCommand05 + ', TABLOCK'
5156
5157 EXECUTE @CurrentCommandOutput05 = [dbo].[CommandExecute] @Command = @CurrentCommand05, @CommandType = @CurrentCommandType05, @Mode = 1, @DatabaseName = @CurrentDatabaseName, @LogToTable = @LogToTable, @Execute = @Execute
5158 SET @Error = @@ERROR
5159 IF @Error <> 0 SET @CurrentCommandOutput05 = @Error
5160 IF @CurrentCommandOutput05 <> 0 SET @ReturnCode = @CurrentCommandOutput05
5161 END
5162
5163 -- Check objects
5164 IF EXISTS(SELECT * FROM @SelectedCheckCommands WHERE CheckCommand = 'CHECKTABLE') AND (GETDATE() < DATEADD(ss,@TimeLimit,@StartTime) OR @TimeLimit IS NULL)
5165 BEGIN
5166 SET @CurrentCommand06 = 'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SELECT schemas.[schema_id] AS SchemaID, schemas.[name] AS SchemaName, objects.[object_id] AS ObjectID, objects.[name] AS ObjectName, RTRIM(objects.[type]) AS ObjectType, 0 AS [Order], 0 AS Selected, 0 AS Completed FROM ' + QUOTENAME(@CurrentDatabaseName) + '.sys.objects objects INNER JOIN ' + QUOTENAME(@CurrentDatabaseName) + '.sys.schemas schemas ON objects.schema_id = schemas.schema_id LEFT OUTER JOIN ' + QUOTENAME(@CurrentDatabaseName) + '.sys.tables tables ON objects.object_id = tables.object_id WHERE objects.[type] IN(''U'',''V'') AND EXISTS(SELECT * FROM ' + QUOTENAME(@CurrentDatabaseName) + '.sys.indexes indexes WHERE indexes.object_id = objects.object_id)' + CASE WHEN @Version >= 12 THEN ' AND (tables.is_memory_optimized = 0 OR is_memory_optimized IS NULL)' ELSE '' END + ' ORDER BY schemas.name ASC, objects.name ASC'
5167
5168 INSERT INTO @tmpObjects (SchemaID, SchemaName, ObjectID, ObjectName, ObjectType, [Order], Selected, Completed)
5169 EXECUTE sp_executesql @statement = @CurrentCommand06
5170 SET @Error = @@ERROR
5171 IF @Error <> 0 SET @ReturnCode = @Error
5172
5173 IF @Objects IS NULL
5174 BEGIN
5175 UPDATE tmpObjects
5176 SET tmpObjects.Selected = 1
5177 FROM @tmpObjects tmpObjects
5178 END
5179 ELSE
5180 BEGIN
5181 UPDATE tmpObjects
5182 SET tmpObjects.Selected = SelectedObjects.Selected
5183 FROM @tmpObjects tmpObjects
5184 INNER JOIN @SelectedObjects SelectedObjects
5185 ON @CurrentDatabaseName LIKE REPLACE(SelectedObjects.DatabaseName,'_','[_]') AND tmpObjects.SchemaName LIKE REPLACE(SelectedObjects.SchemaName,'_','[_]') AND tmpObjects.ObjectName LIKE REPLACE(SelectedObjects.ObjectName,'_','[_]')
5186 WHERE SelectedObjects.Selected = 1
5187
5188 UPDATE tmpObjects
5189 SET tmpObjects.Selected = SelectedObjects.Selected
5190 FROM @tmpObjects tmpObjects
5191 INNER JOIN @SelectedObjects SelectedObjects
5192 ON @CurrentDatabaseName LIKE REPLACE(SelectedObjects.DatabaseName,'_','[_]') AND tmpObjects.SchemaName LIKE REPLACE(SelectedObjects.SchemaName,'_','[_]') AND tmpObjects.ObjectName LIKE REPLACE(SelectedObjects.ObjectName,'_','[_]')
5193 WHERE SelectedObjects.Selected = 0
5194
5195 UPDATE tmpObjects
5196 SET tmpObjects.StartPosition = SelectedObjects2.StartPosition
5197 FROM @tmpObjects tmpObjects
5198 INNER JOIN (SELECT tmpObjects.SchemaName, tmpObjects.ObjectName, MIN(SelectedObjects.StartPosition) AS StartPosition
5199 FROM @tmpObjects tmpObjects
5200 INNER JOIN @SelectedObjects SelectedObjects
5201 ON @CurrentDatabaseName LIKE REPLACE(SelectedObjects.DatabaseName,'_','[_]') AND tmpObjects.SchemaName LIKE REPLACE(SelectedObjects.SchemaName,'_','[_]') AND tmpObjects.ObjectName LIKE REPLACE(SelectedObjects.ObjectName,'_','[_]')
5202 WHERE SelectedObjects.Selected = 1
5203 GROUP BY tmpObjects.SchemaName, tmpObjects.ObjectName) SelectedObjects2
5204 ON tmpObjects.SchemaName = SelectedObjects2.SchemaName AND tmpObjects.ObjectName = SelectedObjects2.ObjectName
5205 END;
5206
5207 WITH tmpObjects AS (
5208 SELECT SchemaName, ObjectName, [Order], ROW_NUMBER() OVER (ORDER BY StartPosition ASC, SchemaName ASC, ObjectName ASC) AS RowNumber
5209 FROM @tmpObjects tmpObjects
5210 WHERE Selected = 1
5211 )
5212 UPDATE tmpObjects
5213 SET [Order] = RowNumber
5214
5215 SET @ErrorMessage = ''
5216 SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + '.' + QUOTENAME(SchemaName) + '.' + QUOTENAME(ObjectName) + ', '
5217 FROM @SelectedObjects SelectedObjects
5218 WHERE DatabaseName = @CurrentDatabaseName
5219 AND SchemaName NOT LIKE '%[%]%'
5220 AND ObjectName NOT LIKE '%[%]%'
5221 AND NOT EXISTS (SELECT * FROM @tmpObjects WHERE SchemaName = SelectedObjects.SchemaName AND ObjectName = SelectedObjects.ObjectName)
5222 IF @@ROWCOUNT > 0
5223 BEGIN
5224 SET @ErrorMessage = 'The following objects do not exist: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.'
5225 RAISERROR('%s',10,1,@ErrorMessage) WITH NOWAIT
5226 SET @Error = @@ERROR
5227 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
5228 END
5229
5230 WHILE (GETDATE() < DATEADD(ss,@TimeLimit,@StartTime) OR @TimeLimit IS NULL)
5231 BEGIN
5232 SELECT TOP 1 @CurrentOID = ID,
5233 @CurrentSchemaID = SchemaID,
5234 @CurrentSchemaName = SchemaName,
5235 @CurrentObjectID = ObjectID,
5236 @CurrentObjectName = ObjectName,
5237 @CurrentObjectType = ObjectType
5238 FROM @tmpObjects
5239 WHERE Selected = 1
5240 AND Completed = 0
5241 ORDER BY [Order] ASC
5242
5243 IF @@ROWCOUNT = 0
5244 BEGIN
5245 BREAK
5246 END
5247
5248 -- Does the object exist?
5249 SET @CurrentCommand07 = ''
5250 IF @LockTimeout IS NOT NULL SET @CurrentCommand07 = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; '
5251 SET @CurrentCommand07 = @CurrentCommand07 + 'IF EXISTS(SELECT * FROM ' + QUOTENAME(@CurrentDatabaseName) + '.sys.objects objects INNER JOIN ' + QUOTENAME(@CurrentDatabaseName) + '.sys.schemas schemas ON objects.schema_id = schemas.schema_id LEFT OUTER JOIN ' + QUOTENAME(@CurrentDatabaseName) + '.sys.tables tables ON objects.object_id = tables.object_id WHERE objects.[type] IN(''U'',''V'') AND EXISTS(SELECT * FROM ' + QUOTENAME(@CurrentDatabaseName) + '.sys.indexes indexes WHERE indexes.object_id = objects.object_id)' + CASE WHEN @Version >= 12 THEN ' AND (tables.is_memory_optimized = 0 OR is_memory_optimized IS NULL)' ELSE '' END + ' AND schemas.[schema_id] = @ParamSchemaID AND schemas.[name] = @ParamSchemaName AND objects.[object_id] = @ParamObjectID AND objects.[name] = @ParamObjectName AND objects.[type] = @ParamObjectType) BEGIN SET @ParamObjectExists = 1 END'
5252
5253 BEGIN TRY
5254 EXECUTE sp_executesql @statement = @CurrentCommand07, @params = N'@ParamSchemaID int, @ParamSchemaName sysname, @ParamObjectID int, @ParamObjectName sysname, @ParamObjectType sysname, @ParamObjectExists bit OUTPUT', @ParamSchemaID = @CurrentSchemaID, @ParamSchemaName = @CurrentSchemaName, @ParamObjectID = @CurrentObjectID, @ParamObjectName = @CurrentObjectName, @ParamObjectType = @CurrentObjectType, @ParamObjectExists = @CurrentObjectExists OUTPUT
5255
5256 IF @CurrentObjectExists IS NULL SET @CurrentObjectExists = 0
5257 END TRY
5258 BEGIN CATCH
5259 SET @ErrorMessage = 'Msg ' + CAST(ERROR_NUMBER() AS nvarchar) + ', ' + ISNULL(ERROR_MESSAGE(),'') + CASE WHEN ERROR_NUMBER() = 1222 THEN ', ' + 'The object ' + QUOTENAME(@CurrentDatabaseName) + '.' + QUOTENAME(@CurrentSchemaName) + '.' + QUOTENAME(@CurrentObjectName) + ' is locked. It could not be checked if the object exists.' ELSE '' END
5260 SET @Severity = CASE WHEN ERROR_NUMBER() IN(1205,1222) THEN @LockMessageSeverity ELSE 16 END
5261 RAISERROR('%s',@Severity,1,@ErrorMessage) WITH NOWAIT
5262 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
5263
5264 IF NOT (ERROR_NUMBER() IN(1205,1222) AND @LockMessageSeverity = 10)
5265 BEGIN
5266 SET @ReturnCode = ERROR_NUMBER()
5267 END
5268 END CATCH
5269
5270 IF @CurrentObjectExists = 1
5271 BEGIN
5272 SET @CurrentCommandType08 = 'DBCC_CHECKTABLE'
5273
5274 SET @CurrentCommand08 = ''
5275 IF @LockTimeout IS NOT NULL SET @CurrentCommand08 = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; '
5276 SET @CurrentCommand08 = @CurrentCommand08 + 'USE ' + QUOTENAME(@CurrentDatabaseName) + '; DBCC CHECKTABLE (''' + QUOTENAME(@CurrentSchemaName) + '.' + QUOTENAME(@CurrentObjectName) + ''''
5277 IF @NoIndex = 'Y' SET @CurrentCommand08 = @CurrentCommand08 + ', NOINDEX'
5278 SET @CurrentCommand08 = @CurrentCommand08 + ') WITH NO_INFOMSGS, ALL_ERRORMSGS'
5279 IF @PhysicalOnly = 'N' SET @CurrentCommand08 = @CurrentCommand08 + ', DATA_PURITY'
5280 IF @PhysicalOnly = 'Y' SET @CurrentCommand08 = @CurrentCommand08 + ', PHYSICAL_ONLY'
5281 IF @ExtendedLogicalChecks = 'Y' SET @CurrentCommand08 = @CurrentCommand08 + ', EXTENDED_LOGICAL_CHECKS'
5282 IF @TabLock = 'Y' SET @CurrentCommand08 = @CurrentCommand08 + ', TABLOCK'
5283 IF @MaxDOP IS NOT NULL SET @CurrentCommand08 = @CurrentCommand08 + ', MAXDOP = ' + CAST(@MaxDOP AS nvarchar)
5284
5285 EXECUTE @CurrentCommandOutput08 = [dbo].[CommandExecute] @Command = @CurrentCommand08, @CommandType = @CurrentCommandType08, @Mode = 1, @DatabaseName = @CurrentDatabaseName, @SchemaName = @CurrentSchemaName, @ObjectName = @CurrentObjectName, @ObjectType = @CurrentObjectType, @LogToTable = @LogToTable, @Execute = @Execute
5286 SET @Error = @@ERROR
5287 IF @Error <> 0 SET @CurrentCommandOutput08 = @Error
5288 IF @CurrentCommandOutput08 <> 0 SET @ReturnCode = @CurrentCommandOutput08
5289 END
5290
5291 UPDATE @tmpObjects
5292 SET Completed = 1
5293 WHERE Selected = 1
5294 AND Completed = 0
5295 AND ID = @CurrentOID
5296
5297 SET @CurrentOID = NULL
5298 SET @CurrentSchemaID = NULL
5299 SET @CurrentSchemaName = NULL
5300 SET @CurrentObjectID = NULL
5301 SET @CurrentObjectName = NULL
5302 SET @CurrentObjectType = NULL
5303 SET @CurrentObjectExists = NULL
5304
5305 SET @CurrentCommand07 = NULL
5306 SET @CurrentCommand08 = NULL
5307
5308 SET @CurrentCommandOutput08 = NULL
5309
5310 SET @CurrentCommandType08 = NULL
5311 END
5312 END
5313
5314 -- Check catalog
5315 IF EXISTS(SELECT * FROM @SelectedCheckCommands WHERE CheckCommand = 'CHECKCATALOG') AND (GETDATE() < DATEADD(ss,@TimeLimit,@StartTime) OR @TimeLimit IS NULL)
5316 BEGIN
5317 SET @CurrentCommandType09 = 'DBCC_CHECKCATALOG'
5318
5319 SET @CurrentCommand09 = ''
5320 IF @LockTimeout IS NOT NULL SET @CurrentCommand09 = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; '
5321 SET @CurrentCommand09 = @CurrentCommand09 + 'DBCC CHECKCATALOG (' + QUOTENAME(@CurrentDatabaseName)
5322 SET @CurrentCommand09 = @CurrentCommand09 + ') WITH NO_INFOMSGS'
5323
5324 EXECUTE @CurrentCommandOutput09 = [dbo].[CommandExecute] @Command = @CurrentCommand09, @CommandType = @CurrentCommandType09, @Mode = 1, @DatabaseName = @CurrentDatabaseName, @LogToTable = @LogToTable, @Execute = @Execute
5325 SET @Error = @@ERROR
5326 IF @Error <> 0 SET @CurrentCommandOutput09 = @Error
5327 IF @CurrentCommandOutput09 <> 0 SET @ReturnCode = @CurrentCommandOutput09
5328 END
5329
5330 END
5331
5332 IF DATABASEPROPERTYEX(@CurrentDatabaseName,'Status') = 'SUSPECT'
5333 BEGIN
5334 SET @ErrorMessage = 'The database ' + QUOTENAME(@CurrentDatabaseName) + ' is in a SUSPECT state.'
5335 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
5336 SET @Error = @@ERROR
5337 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
5338 END
5339
5340 -- Update that the database is completed
5341 IF @DatabasesInParallel = 'Y'
5342 BEGIN
5343 UPDATE dbo.QueueDatabase
5344 SET DatabaseEndTime = GETDATE()
5345 WHERE QueueID = @QueueID
5346 AND DatabaseName = @CurrentDatabaseName
5347 END
5348 ELSE
5349 BEGIN
5350 UPDATE @tmpDatabases
5351 SET Completed = 1
5352 WHERE Selected = 1
5353 AND Completed = 0
5354 AND ID = @CurrentDBID
5355 END
5356
5357 -- Clear variables
5358 SET @CurrentDBID = NULL
5359 SET @CurrentDatabaseID = NULL
5360 SET @CurrentDatabaseName = NULL
5361 SET @CurrentIsDatabaseAccessible = NULL
5362 SET @CurrentAvailabilityGroup = NULL
5363 SET @CurrentAvailabilityGroupRole = NULL
5364 SET @CurrentAvailabilityGroupBackupPreference = NULL
5365 SET @CurrentIsPreferredBackupReplica = NULL
5366 SET @CurrentDatabaseMirroringRole = NULL
5367 SET @CurrentIsReadOnly = NULL
5368
5369 SET @CurrentCommand01 = NULL
5370 SET @CurrentCommand02 = NULL
5371 SET @CurrentCommand05 = NULL
5372 SET @CurrentCommand06 = NULL
5373 SET @CurrentCommand09 = NULL
5374
5375 SET @CurrentCommandOutput01 = NULL
5376 SET @CurrentCommandOutput05 = NULL
5377 SET @CurrentCommandOutput09 = NULL
5378
5379 SET @CurrentCommandType01 = NULL
5380 SET @CurrentCommandType05 = NULL
5381 SET @CurrentCommandType09 = NULL
5382
5383 DELETE FROM @tmpFileGroups
5384 DELETE FROM @tmpObjects
5385
5386 END
5387
5388 ----------------------------------------------------------------------------------------------------
5389 --// Log completing information //--
5390 ----------------------------------------------------------------------------------------------------
5391
5392 Logging:
5393 SET @EndMessage = 'Date and time: ' + CONVERT(nvarchar,GETDATE(),120)
5394 RAISERROR('%s',10,1,@EndMessage) WITH NOWAIT
5395
5396 IF @ReturnCode <> 0
5397 BEGIN
5398 RETURN @ReturnCode
5399 END
5400
5401 ----------------------------------------------------------------------------------------------------
5402
5403END
5404
5405GO
5406SET ANSI_NULLS ON
5407GO
5408SET QUOTED_IDENTIFIER ON
5409GO
5410IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[IndexOptimize]') AND type in (N'P', N'PC'))
5411BEGIN
5412EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[IndexOptimize] AS'
5413END
5414GO
5415ALTER PROCEDURE [dbo].[IndexOptimize]
5416
5417@Databases nvarchar(max) = NULL,
5418@FragmentationLow nvarchar(max) = NULL,
5419@FragmentationMedium nvarchar(max) = 'INDEX_REORGANIZE,INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
5420@FragmentationHigh nvarchar(max) = 'INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
5421@FragmentationLevel1 int = 5,
5422@FragmentationLevel2 int = 30,
5423@MinNumberOfPages int = 1000,
5424@MaxNumberOfPages int = NULL,
5425@SortInTempdb nvarchar(max) = 'N',
5426@MaxDOP int = NULL,
5427@FillFactor int = NULL,
5428@PadIndex nvarchar(max) = NULL,
5429@LOBCompaction nvarchar(max) = 'Y',
5430@UpdateStatistics nvarchar(max) = NULL,
5431@OnlyModifiedStatistics nvarchar(max) = 'N',
5432@StatisticsModificationLevel int = NULL,
5433@StatisticsSample int = NULL,
5434@StatisticsResample nvarchar(max) = 'N',
5435@PartitionLevel nvarchar(max) = 'Y',
5436@MSShippedObjects nvarchar(max) = 'N',
5437@Indexes nvarchar(max) = NULL,
5438@TimeLimit int = NULL,
5439@Delay int = NULL,
5440@WaitAtLowPriorityMaxDuration int = NULL,
5441@WaitAtLowPriorityAbortAfterWait nvarchar(max) = NULL,
5442@Resumable nvarchar(max) = 'N',
5443@AvailabilityGroups nvarchar(max) = NULL,
5444@LockTimeout int = NULL,
5445@LockMessageSeverity int = 16,
5446@DatabaseOrder nvarchar(max) = NULL,
5447@DatabasesInParallel nvarchar(max) = 'N',
5448@LogToTable nvarchar(max) = 'N',
5449@Execute nvarchar(max) = 'Y'
5450
5451AS
5452
5453BEGIN
5454
5455 ----------------------------------------------------------------------------------------------------
5456 --// Source: https://ola.hallengren.com //--
5457 --// License: https://ola.hallengren.com/license.html //--
5458 --// GitHub: https://github.com/olahallengren/sql-server-maintenance-solution //--
5459 --// Version: 2019-04-28 16:40:00 //--
5460 ----------------------------------------------------------------------------------------------------
5461
5462 SET NOCOUNT ON
5463
5464 SET ARITHABORT ON
5465
5466 SET NUMERIC_ROUNDABORT OFF
5467
5468 DECLARE @StartMessage nvarchar(max)
5469 DECLARE @EndMessage nvarchar(max)
5470 DECLARE @DatabaseMessage nvarchar(max)
5471 DECLARE @ErrorMessage nvarchar(max)
5472 DECLARE @Severity int
5473
5474 DECLARE @StartTime datetime
5475 DECLARE @SchemaName nvarchar(max)
5476 DECLARE @ObjectName nvarchar(max)
5477 DECLARE @VersionTimestamp nvarchar(max)
5478 DECLARE @Parameters nvarchar(max)
5479
5480 DECLARE @Version numeric(18,10)
5481 DECLARE @HostPlatform nvarchar(max)
5482 DECLARE @AmazonRDS bit
5483
5484 DECLARE @PartitionLevelStatistics bit
5485
5486 DECLARE @QueueID int
5487 DECLARE @QueueStartTime datetime
5488
5489 DECLARE @CurrentDBID int
5490 DECLARE @CurrentDatabaseID int
5491 DECLARE @CurrentDatabaseName nvarchar(max)
5492 DECLARE @CurrentIsDatabaseAccessible bit
5493 DECLARE @CurrentAvailabilityGroup nvarchar(max)
5494 DECLARE @CurrentAvailabilityGroupRole nvarchar(max)
5495 DECLARE @CurrentDatabaseMirroringRole nvarchar(max)
5496 DECLARE @CurrentIsReadOnly bit
5497
5498 DECLARE @CurrentCommand01 nvarchar(max)
5499 DECLARE @CurrentCommand02 nvarchar(max)
5500 DECLARE @CurrentCommand03 nvarchar(max)
5501 DECLARE @CurrentCommand04 nvarchar(max)
5502 DECLARE @CurrentCommand05 nvarchar(max)
5503 DECLARE @CurrentCommand06 nvarchar(max)
5504 DECLARE @CurrentCommand07 nvarchar(max)
5505
5506 DECLARE @CurrentCommandOutput06 int
5507 DECLARE @CurrentCommandOutput07 int
5508
5509 DECLARE @CurrentCommandType06 nvarchar(max)
5510 DECLARE @CurrentCommandType07 nvarchar(max)
5511
5512 DECLARE @CurrentComment06 nvarchar(max)
5513 DECLARE @CurrentComment07 nvarchar(max)
5514
5515 DECLARE @CurrentExtendedInfo06 xml
5516 DECLARE @CurrentExtendedInfo07 xml
5517
5518 DECLARE @CurrentIxID int
5519 DECLARE @CurrentIxOrder int
5520 DECLARE @CurrentSchemaID int
5521 DECLARE @CurrentSchemaName nvarchar(max)
5522 DECLARE @CurrentObjectID int
5523 DECLARE @CurrentObjectName nvarchar(max)
5524 DECLARE @CurrentObjectType nvarchar(max)
5525 DECLARE @CurrentIsMemoryOptimized bit
5526 DECLARE @CurrentIndexID int
5527 DECLARE @CurrentIndexName nvarchar(max)
5528 DECLARE @CurrentIndexType int
5529 DECLARE @CurrentStatisticsID int
5530 DECLARE @CurrentStatisticsName nvarchar(max)
5531 DECLARE @CurrentPartitionID bigint
5532 DECLARE @CurrentPartitionNumber int
5533 DECLARE @CurrentPartitionCount int
5534 DECLARE @CurrentIsPartition bit
5535 DECLARE @CurrentIndexExists bit
5536 DECLARE @CurrentStatisticsExists bit
5537 DECLARE @CurrentIsImageText bit
5538 DECLARE @CurrentIsNewLOB bit
5539 DECLARE @CurrentIsFileStream bit
5540 DECLARE @CurrentIsColumnStore bit
5541 DECLARE @CurrentIsComputed bit
5542 DECLARE @CurrentIsTimestamp bit
5543 DECLARE @CurrentAllowPageLocks bit
5544 DECLARE @CurrentNoRecompute bit
5545 DECLARE @CurrentIsIncremental bit
5546 DECLARE @CurrentRowCount bigint
5547 DECLARE @CurrentModificationCounter bigint
5548 DECLARE @CurrentOnReadOnlyFileGroup bit
5549 DECLARE @CurrentResumableIndexOperation bit
5550 DECLARE @CurrentFragmentationLevel float
5551 DECLARE @CurrentPageCount bigint
5552 DECLARE @CurrentFragmentationGroup nvarchar(max)
5553 DECLARE @CurrentAction nvarchar(max)
5554 DECLARE @CurrentMaxDOP int
5555 DECLARE @CurrentUpdateStatistics nvarchar(max)
5556 DECLARE @CurrentStatisticsSample int
5557 DECLARE @CurrentStatisticsResample nvarchar(max)
5558 DECLARE @CurrentDelay datetime
5559
5560 DECLARE @tmpDatabases TABLE (ID int IDENTITY,
5561 DatabaseName nvarchar(max),
5562 DatabaseType nvarchar(max),
5563 AvailabilityGroup bit,
5564 StartPosition int,
5565 DatabaseSize bigint,
5566 [Order] int,
5567 Selected bit,
5568 Completed bit,
5569 PRIMARY KEY(Selected, Completed, [Order], ID))
5570
5571 DECLARE @tmpAvailabilityGroups TABLE (ID int IDENTITY PRIMARY KEY,
5572 AvailabilityGroupName nvarchar(max),
5573 StartPosition int,
5574 Selected bit)
5575
5576 DECLARE @tmpDatabasesAvailabilityGroups TABLE (DatabaseName nvarchar(max),
5577 AvailabilityGroupName nvarchar(max))
5578
5579 DECLARE @tmpIndexesStatistics TABLE (ID int IDENTITY,
5580 SchemaID int,
5581 SchemaName nvarchar(max),
5582 ObjectID int,
5583 ObjectName nvarchar(max),
5584 ObjectType nvarchar(max),
5585 IsMemoryOptimized bit,
5586 IndexID int,
5587 IndexName nvarchar(max),
5588 IndexType int,
5589 AllowPageLocks bit,
5590 IsImageText bit,
5591 IsNewLOB bit,
5592 IsFileStream bit,
5593 IsColumnStore bit,
5594 IsComputed bit,
5595 IsTimestamp bit,
5596 OnReadOnlyFileGroup bit,
5597 ResumableIndexOperation bit,
5598 StatisticsID int,
5599 StatisticsName nvarchar(max),
5600 [NoRecompute] bit,
5601 IsIncremental bit,
5602 PartitionID bigint,
5603 PartitionNumber int,
5604 PartitionCount int,
5605 StartPosition int,
5606 [Order] int,
5607 Selected bit,
5608 Completed bit,
5609 PRIMARY KEY(Selected, Completed, [Order], ID))
5610
5611 DECLARE @SelectedDatabases TABLE (DatabaseName nvarchar(max),
5612 DatabaseType nvarchar(max),
5613 AvailabilityGroup nvarchar(max),
5614 StartPosition int,
5615 Selected bit)
5616
5617 DECLARE @SelectedAvailabilityGroups TABLE (AvailabilityGroupName nvarchar(max),
5618 StartPosition int,
5619 Selected bit)
5620
5621 DECLARE @SelectedIndexes TABLE (DatabaseName nvarchar(max),
5622 SchemaName nvarchar(max),
5623 ObjectName nvarchar(max),
5624 IndexName nvarchar(max),
5625 StartPosition int,
5626 Selected bit)
5627
5628 DECLARE @Actions TABLE ([Action] nvarchar(max))
5629
5630 INSERT INTO @Actions([Action]) VALUES('INDEX_REBUILD_ONLINE')
5631 INSERT INTO @Actions([Action]) VALUES('INDEX_REBUILD_OFFLINE')
5632 INSERT INTO @Actions([Action]) VALUES('INDEX_REORGANIZE')
5633
5634 DECLARE @ActionsPreferred TABLE (FragmentationGroup nvarchar(max),
5635 [Priority] int,
5636 [Action] nvarchar(max))
5637
5638 DECLARE @CurrentActionsAllowed TABLE ([Action] nvarchar(max))
5639
5640 DECLARE @CurrentAlterIndexWithClauseArguments TABLE (ID int IDENTITY,
5641 Argument nvarchar(max),
5642 Added bit DEFAULT 0)
5643
5644 DECLARE @CurrentAlterIndexArgumentID int
5645 DECLARE @CurrentAlterIndexArgument nvarchar(max)
5646 DECLARE @CurrentAlterIndexWithClause nvarchar(max)
5647
5648 DECLARE @CurrentUpdateStatisticsWithClauseArguments TABLE (ID int IDENTITY,
5649 Argument nvarchar(max),
5650 Added bit DEFAULT 0)
5651
5652 DECLARE @CurrentUpdateStatisticsArgumentID int
5653 DECLARE @CurrentUpdateStatisticsArgument nvarchar(max)
5654 DECLARE @CurrentUpdateStatisticsWithClause nvarchar(max)
5655
5656 DECLARE @Error int
5657 DECLARE @ReturnCode int
5658
5659 DECLARE @EmptyLine nvarchar(max)
5660
5661 SET @Error = 0
5662 SET @ReturnCode = 0
5663
5664 SET @EmptyLine = CHAR(9)
5665
5666 SET @Version = CAST(LEFT(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max)),CHARINDEX('.',CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max))) - 1) + '.' + REPLACE(RIGHT(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max)), LEN(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max))) - CHARINDEX('.',CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max)))),'.','') AS numeric(18,10))
5667
5668 IF @Version >= 14
5669 BEGIN
5670 SELECT @HostPlatform = host_platform
5671 FROM sys.dm_os_host_info
5672 END
5673 ELSE
5674 BEGIN
5675 SET @HostPlatform = 'Windows'
5676 END
5677
5678 SET @AmazonRDS = CASE WHEN DB_ID('rdsadmin') IS NOT NULL AND SUSER_SNAME(0x01) = 'rdsa' THEN 1 ELSE 0 END
5679
5680 ----------------------------------------------------------------------------------------------------
5681 --// Log initial information //--
5682 ----------------------------------------------------------------------------------------------------
5683
5684 SET @StartTime = GETDATE()
5685 SET @SchemaName = (SELECT schemas.name FROM sys.schemas schemas INNER JOIN sys.objects objects ON schemas.[schema_id] = objects.[schema_id] WHERE [object_id] = @@PROCID)
5686 SET @ObjectName = OBJECT_NAME(@@PROCID)
5687 SET @VersionTimestamp = SUBSTRING(OBJECT_DEFINITION(@@PROCID),CHARINDEX('--// Version: ',OBJECT_DEFINITION(@@PROCID)) + LEN('--// Version: ') + 1, 19)
5688
5689 SET @Parameters = '@Databases = ' + ISNULL('''' + REPLACE(@Databases,'''','''''') + '''','NULL')
5690 SET @Parameters = @Parameters + ', @FragmentationLow = ' + ISNULL('''' + REPLACE(@FragmentationLow,'''','''''') + '''','NULL')
5691 SET @Parameters = @Parameters + ', @FragmentationMedium = ' + ISNULL('''' + REPLACE(@FragmentationMedium,'''','''''') + '''','NULL')
5692 SET @Parameters = @Parameters + ', @FragmentationHigh = ' + ISNULL('''' + REPLACE(@FragmentationHigh,'''','''''') + '''','NULL')
5693 SET @Parameters = @Parameters + ', @FragmentationLevel1 = ' + ISNULL(CAST(@FragmentationLevel1 AS nvarchar),'NULL')
5694 SET @Parameters = @Parameters + ', @FragmentationLevel2 = ' + ISNULL(CAST(@FragmentationLevel2 AS nvarchar),'NULL')
5695 SET @Parameters = @Parameters + ', @MinNumberOfPages = ' + ISNULL(CAST(@MinNumberOfPages AS nvarchar),'NULL')
5696 SET @Parameters = @Parameters + ', @MaxNumberOfPages = ' + ISNULL(CAST(@MaxNumberOfPages AS nvarchar),'NULL')
5697 SET @Parameters = @Parameters + ', @SortInTempdb = ' + ISNULL('''' + REPLACE(@SortInTempdb,'''','''''') + '''','NULL')
5698 SET @Parameters = @Parameters + ', @MaxDOP = ' + ISNULL(CAST(@MaxDOP AS nvarchar),'NULL')
5699 SET @Parameters = @Parameters + ', @FillFactor = ' + ISNULL(CAST(@FillFactor AS nvarchar),'NULL')
5700 SET @Parameters = @Parameters + ', @PadIndex = ' + ISNULL('''' + REPLACE(@PadIndex,'''','''''') + '''','NULL')
5701 SET @Parameters = @Parameters + ', @LOBCompaction = ' + ISNULL('''' + REPLACE(@LOBCompaction,'''','''''') + '''','NULL')
5702 SET @Parameters = @Parameters + ', @UpdateStatistics = ' + ISNULL('''' + REPLACE(@UpdateStatistics,'''','''''') + '''','NULL')
5703 SET @Parameters = @Parameters + ', @OnlyModifiedStatistics = ' + ISNULL('''' + REPLACE(@OnlyModifiedStatistics,'''','''''') + '''','NULL')
5704 SET @Parameters = @Parameters + ', @StatisticsModificationLevel = ' + ISNULL(CAST(@StatisticsModificationLevel AS nvarchar),'NULL')
5705 SET @Parameters = @Parameters + ', @StatisticsSample = ' + ISNULL(CAST(@StatisticsSample AS nvarchar),'NULL')
5706 SET @Parameters = @Parameters + ', @StatisticsResample = ' + ISNULL('''' + REPLACE(@StatisticsResample,'''','''''') + '''','NULL')
5707 SET @Parameters = @Parameters + ', @PartitionLevel = ' + ISNULL('''' + REPLACE(@PartitionLevel,'''','''''') + '''','NULL')
5708 SET @Parameters = @Parameters + ', @MSShippedObjects = ' + ISNULL('''' + REPLACE(@MSShippedObjects,'''','''''') + '''','NULL')
5709 SET @Parameters = @Parameters + ', @Indexes = ' + ISNULL('''' + REPLACE(@Indexes,'''','''''') + '''','NULL')
5710 SET @Parameters = @Parameters + ', @TimeLimit = ' + ISNULL(CAST(@TimeLimit AS nvarchar),'NULL')
5711 SET @Parameters = @Parameters + ', @Delay = ' + ISNULL(CAST(@Delay AS nvarchar),'NULL')
5712 SET @Parameters = @Parameters + ', @WaitAtLowPriorityMaxDuration = ' + ISNULL(CAST(@WaitAtLowPriorityMaxDuration AS nvarchar),'NULL')
5713 SET @Parameters = @Parameters + ', @WaitAtLowPriorityAbortAfterWait = ' + ISNULL('''' + REPLACE(@WaitAtLowPriorityAbortAfterWait,'''','''''') + '''','NULL')
5714 SET @Parameters = @Parameters + ', @Resumable = ' + ISNULL('''' + REPLACE(@Resumable,'''','''''') + '''','NULL')
5715 SET @Parameters = @Parameters + ', @AvailabilityGroups = ' + ISNULL('''' + REPLACE(@AvailabilityGroups,'''','''''') + '''','NULL')
5716 SET @Parameters = @Parameters + ', @LockTimeout = ' + ISNULL(CAST(@LockTimeout AS nvarchar),'NULL')
5717 SET @Parameters = @Parameters + ', @LockMessageSeverity = ' + ISNULL(CAST(@LockMessageSeverity AS nvarchar),'NULL')
5718 SET @Parameters = @Parameters + ', @DatabaseOrder = ' + ISNULL('''' + REPLACE(@DatabaseOrder,'''','''''') + '''','NULL')
5719 SET @Parameters = @Parameters + ', @DatabasesInParallel = ' + ISNULL('''' + REPLACE(@DatabasesInParallel,'''','''''') + '''','NULL')
5720 SET @Parameters = @Parameters + ', @LogToTable = ' + ISNULL('''' + REPLACE(@LogToTable,'''','''''') + '''','NULL')
5721 SET @Parameters = @Parameters + ', @Execute = ' + ISNULL('''' + REPLACE(@Execute,'''','''''') + '''','NULL')
5722
5723 SET @StartMessage = 'Date and time: ' + CONVERT(nvarchar,@StartTime,120)
5724 RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT
5725
5726 SET @StartMessage = 'Server: ' + CAST(SERVERPROPERTY('ServerName') AS nvarchar(max))
5727 RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT
5728
5729 SET @StartMessage = 'Version: ' + CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max))
5730 RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT
5731
5732 SET @StartMessage = 'Edition: ' + CAST(SERVERPROPERTY('Edition') AS nvarchar(max))
5733 RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT
5734
5735 SET @StartMessage = 'Platform: ' + @HostPlatform
5736 RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT
5737
5738 SET @StartMessage = 'Procedure: ' + QUOTENAME(DB_NAME(DB_ID())) + '.' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(@ObjectName)
5739 RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT
5740
5741 SET @StartMessage = 'Parameters: ' + @Parameters
5742 RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT
5743
5744 SET @StartMessage = 'Version: ' + @VersionTimestamp
5745 RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT
5746
5747 SET @StartMessage = 'Source: https://ola.hallengren.com'
5748 RAISERROR('%s',10,1,@StartMessage) WITH NOWAIT
5749
5750 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
5751
5752 ----------------------------------------------------------------------------------------------------
5753 --// Check core requirements //--
5754 ----------------------------------------------------------------------------------------------------
5755
5756 IF NOT (SELECT [compatibility_level] FROM sys.databases WHERE database_id = DB_ID()) >= 90
5757 BEGIN
5758 SET @ErrorMessage = 'The database ' + QUOTENAME(DB_NAME(DB_ID())) + ' has to be in compatibility level 90 or higher.'
5759 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
5760 SET @Error = @@ERROR
5761 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
5762 END
5763
5764 IF NOT (SELECT uses_ansi_nulls FROM sys.sql_modules WHERE [object_id] = @@PROCID) = 1
5765 BEGIN
5766 SET @ErrorMessage = 'ANSI_NULLS has to be set to ON for the stored procedure.'
5767 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
5768 SET @Error = @@ERROR
5769 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
5770 END
5771
5772 IF NOT (SELECT uses_quoted_identifier FROM sys.sql_modules WHERE [object_id] = @@PROCID) = 1
5773 BEGIN
5774 SET @ErrorMessage = 'QUOTED_IDENTIFIER has to be set to ON for the stored procedure.'
5775 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
5776 SET @Error = @@ERROR
5777 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
5778 END
5779
5780 IF NOT EXISTS (SELECT * FROM sys.objects objects INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] WHERE objects.[type] = 'P' AND schemas.[name] = 'dbo' AND objects.[name] = 'CommandExecute')
5781 BEGIN
5782 SET @ErrorMessage = 'The stored procedure CommandExecute is missing. Download https://ola.hallengren.com/scripts/CommandExecute.sql.'
5783 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
5784 SET @Error = @@ERROR
5785 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
5786 END
5787
5788 IF EXISTS (SELECT * FROM sys.objects objects INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] WHERE objects.[type] = 'P' AND schemas.[name] = 'dbo' AND objects.[name] = 'CommandExecute' AND OBJECT_DEFINITION(objects.[object_id]) NOT LIKE '%@LockMessageSeverity%')
5789 BEGIN
5790 SET @ErrorMessage = 'The stored procedure CommandExecute needs to be updated. Download https://ola.hallengren.com/scripts/CommandExecute.sql.'
5791 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
5792 SET @Error = @@ERROR
5793 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
5794 END
5795
5796 IF @LogToTable = 'Y' AND NOT EXISTS (SELECT * FROM sys.objects objects INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] WHERE objects.[type] = 'U' AND schemas.[name] = 'dbo' AND objects.[name] = 'CommandLog')
5797 BEGIN
5798 SET @ErrorMessage = 'The table CommandLog is missing. Download https://ola.hallengren.com/scripts/CommandLog.sql.'
5799 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
5800 SET @Error = @@ERROR
5801 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
5802 END
5803
5804 IF @DatabasesInParallel = 'Y' AND NOT EXISTS (SELECT * FROM sys.objects objects INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] WHERE objects.[type] = 'U' AND schemas.[name] = 'dbo' AND objects.[name] = 'Queue')
5805 BEGIN
5806 SET @ErrorMessage = 'The table Queue is missing. Download https://ola.hallengren.com/scripts/Queue.sql.'
5807 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
5808 SET @Error = @@ERROR
5809 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
5810 END
5811
5812 IF @DatabasesInParallel = 'Y' AND NOT EXISTS (SELECT * FROM sys.objects objects INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] WHERE objects.[type] = 'U' AND schemas.[name] = 'dbo' AND objects.[name] = 'QueueDatabase')
5813 BEGIN
5814 SET @ErrorMessage = 'The table QueueDatabase is missing. Download https://ola.hallengren.com/scripts/QueueDatabase.sql.'
5815 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
5816 SET @Error = @@ERROR
5817 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
5818 END
5819
5820 IF @@TRANCOUNT <> 0
5821 BEGIN
5822 SET @ErrorMessage = 'The transaction count is not 0.'
5823 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
5824 SET @Error = @@ERROR
5825 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
5826 END
5827
5828 IF @Error <> 0
5829 BEGIN
5830 SET @ReturnCode = @Error
5831 GOTO Logging
5832 END
5833
5834 ----------------------------------------------------------------------------------------------------
5835 --// Select databases //--
5836 ----------------------------------------------------------------------------------------------------
5837
5838 SET @Databases = REPLACE(@Databases, CHAR(10), '')
5839 SET @Databases = REPLACE(@Databases, CHAR(13), '')
5840
5841 WHILE CHARINDEX(', ',@Databases) > 0 SET @Databases = REPLACE(@Databases,', ',',')
5842 WHILE CHARINDEX(' ,',@Databases) > 0 SET @Databases = REPLACE(@Databases,' ,',',')
5843
5844 SET @Databases = LTRIM(RTRIM(@Databases));
5845
5846 WITH Databases1 (StartPosition, EndPosition, DatabaseItem) AS
5847 (
5848 SELECT 1 AS StartPosition,
5849 ISNULL(NULLIF(CHARINDEX(',', @Databases, 1), 0), LEN(@Databases) + 1) AS EndPosition,
5850 SUBSTRING(@Databases, 1, ISNULL(NULLIF(CHARINDEX(',', @Databases, 1), 0), LEN(@Databases) + 1) - 1) AS DatabaseItem
5851 WHERE @Databases IS NOT NULL
5852 UNION ALL
5853 SELECT CAST(EndPosition AS int) + 1 AS StartPosition,
5854 ISNULL(NULLIF(CHARINDEX(',', @Databases, EndPosition + 1), 0), LEN(@Databases) + 1) AS EndPosition,
5855 SUBSTRING(@Databases, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(',', @Databases, EndPosition + 1), 0), LEN(@Databases) + 1) - EndPosition - 1) AS DatabaseItem
5856 FROM Databases1
5857 WHERE EndPosition < LEN(@Databases) + 1
5858 ),
5859 Databases2 (DatabaseItem, StartPosition, Selected) AS
5860 (
5861 SELECT CASE WHEN DatabaseItem LIKE '-%' THEN RIGHT(DatabaseItem,LEN(DatabaseItem) - 1) ELSE DatabaseItem END AS DatabaseItem,
5862 StartPosition,
5863 CASE WHEN DatabaseItem LIKE '-%' THEN 0 ELSE 1 END AS Selected
5864 FROM Databases1
5865 ),
5866 Databases3 (DatabaseItem, DatabaseType, AvailabilityGroup, StartPosition, Selected) AS
5867 (
5868 SELECT CASE WHEN DatabaseItem IN('ALL_DATABASES','SYSTEM_DATABASES','USER_DATABASES','AVAILABILITY_GROUP_DATABASES') THEN '%' ELSE DatabaseItem END AS DatabaseItem,
5869 CASE WHEN DatabaseItem = 'SYSTEM_DATABASES' THEN 'S' WHEN DatabaseItem = 'USER_DATABASES' THEN 'U' ELSE NULL END AS DatabaseType,
5870 CASE WHEN DatabaseItem = 'AVAILABILITY_GROUP_DATABASES' THEN 1 ELSE NULL END AvailabilityGroup,
5871 StartPosition,
5872 Selected
5873 FROM Databases2
5874 ),
5875 Databases4 (DatabaseName, DatabaseType, AvailabilityGroup, StartPosition, Selected) AS
5876 (
5877 SELECT CASE WHEN LEFT(DatabaseItem,1) = '[' AND RIGHT(DatabaseItem,1) = ']' THEN PARSENAME(DatabaseItem,1) ELSE DatabaseItem END AS DatabaseItem,
5878 DatabaseType,
5879 AvailabilityGroup,
5880 StartPosition,
5881 Selected
5882 FROM Databases3
5883 )
5884 INSERT INTO @SelectedDatabases (DatabaseName, DatabaseType, AvailabilityGroup, StartPosition, Selected)
5885 SELECT DatabaseName,
5886 DatabaseType,
5887 AvailabilityGroup,
5888 StartPosition,
5889 Selected
5890 FROM Databases4
5891 OPTION (MAXRECURSION 0)
5892
5893 IF @Version >= 11 AND SERVERPROPERTY('IsHadrEnabled') = 1
5894 BEGIN
5895 INSERT INTO @tmpAvailabilityGroups (AvailabilityGroupName, Selected)
5896 SELECT name AS AvailabilityGroupName,
5897 0 AS Selected
5898 FROM sys.availability_groups
5899
5900 INSERT INTO @tmpDatabasesAvailabilityGroups (DatabaseName, AvailabilityGroupName)
5901 SELECT databases.name,
5902 availability_groups.name
5903 FROM sys.databases databases
5904 INNER JOIN sys.dm_hadr_availability_replica_states dm_hadr_availability_replica_states ON databases.replica_id = dm_hadr_availability_replica_states.replica_id
5905 INNER JOIN sys.availability_groups availability_groups ON dm_hadr_availability_replica_states.group_id = availability_groups.group_id
5906 END
5907
5908 INSERT INTO @tmpDatabases (DatabaseName, DatabaseType, AvailabilityGroup, [Order], Selected, Completed)
5909 SELECT [name] AS DatabaseName,
5910 CASE WHEN name IN('master','msdb','model') THEN 'S' ELSE 'U' END AS DatabaseType,
5911 NULL AS AvailabilityGroup,
5912 0 AS [Order],
5913 0 AS Selected,
5914 0 AS Completed
5915 FROM sys.databases
5916 WHERE [name] <> 'tempdb'
5917 AND source_database_id IS NULL
5918 ORDER BY [name] ASC
5919
5920 UPDATE tmpDatabases
5921 SET AvailabilityGroup = CASE WHEN EXISTS (SELECT * FROM @tmpDatabasesAvailabilityGroups WHERE DatabaseName = tmpDatabases.DatabaseName) THEN 1 ELSE 0 END
5922 FROM @tmpDatabases tmpDatabases
5923
5924 UPDATE tmpDatabases
5925 SET tmpDatabases.Selected = SelectedDatabases.Selected
5926 FROM @tmpDatabases tmpDatabases
5927 INNER JOIN @SelectedDatabases SelectedDatabases
5928 ON tmpDatabases.DatabaseName LIKE REPLACE(SelectedDatabases.DatabaseName,'_','[_]')
5929 AND (tmpDatabases.DatabaseType = SelectedDatabases.DatabaseType OR SelectedDatabases.DatabaseType IS NULL)
5930 AND (tmpDatabases.AvailabilityGroup = SelectedDatabases.AvailabilityGroup OR SelectedDatabases.AvailabilityGroup IS NULL)
5931 WHERE SelectedDatabases.Selected = 1
5932
5933 UPDATE tmpDatabases
5934 SET tmpDatabases.Selected = SelectedDatabases.Selected
5935 FROM @tmpDatabases tmpDatabases
5936 INNER JOIN @SelectedDatabases SelectedDatabases
5937 ON tmpDatabases.DatabaseName LIKE REPLACE(SelectedDatabases.DatabaseName,'_','[_]')
5938 AND (tmpDatabases.DatabaseType = SelectedDatabases.DatabaseType OR SelectedDatabases.DatabaseType IS NULL)
5939 AND (tmpDatabases.AvailabilityGroup = SelectedDatabases.AvailabilityGroup OR SelectedDatabases.AvailabilityGroup IS NULL)
5940 WHERE SelectedDatabases.Selected = 0
5941
5942 UPDATE tmpDatabases
5943 SET tmpDatabases.StartPosition = SelectedDatabases2.StartPosition
5944 FROM @tmpDatabases tmpDatabases
5945 INNER JOIN (SELECT tmpDatabases.DatabaseName, MIN(SelectedDatabases.StartPosition) AS StartPosition
5946 FROM @tmpDatabases tmpDatabases
5947 INNER JOIN @SelectedDatabases SelectedDatabases
5948 ON tmpDatabases.DatabaseName LIKE REPLACE(SelectedDatabases.DatabaseName,'_','[_]')
5949 AND (tmpDatabases.DatabaseType = SelectedDatabases.DatabaseType OR SelectedDatabases.DatabaseType IS NULL)
5950 AND (tmpDatabases.AvailabilityGroup = SelectedDatabases.AvailabilityGroup OR SelectedDatabases.AvailabilityGroup IS NULL)
5951 WHERE SelectedDatabases.Selected = 1
5952 GROUP BY tmpDatabases.DatabaseName) SelectedDatabases2
5953 ON tmpDatabases.DatabaseName = SelectedDatabases2.DatabaseName
5954
5955 IF @Databases IS NOT NULL AND (NOT EXISTS(SELECT * FROM @SelectedDatabases) OR EXISTS(SELECT * FROM @SelectedDatabases WHERE DatabaseName IS NULL OR DatabaseName = ''))
5956 BEGIN
5957 SET @ErrorMessage = 'The value for the parameter @Databases is not supported.'
5958 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
5959 SET @Error = @@ERROR
5960 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
5961 END
5962
5963 ----------------------------------------------------------------------------------------------------
5964 --// Select availability groups //--
5965 ----------------------------------------------------------------------------------------------------
5966
5967 IF @AvailabilityGroups IS NOT NULL AND @Version >= 11 AND SERVERPROPERTY('IsHadrEnabled') = 1
5968 BEGIN
5969
5970 SET @AvailabilityGroups = REPLACE(@AvailabilityGroups, CHAR(10), '')
5971 SET @AvailabilityGroups = REPLACE(@AvailabilityGroups, CHAR(13), '')
5972
5973 WHILE CHARINDEX(', ',@AvailabilityGroups) > 0 SET @AvailabilityGroups = REPLACE(@AvailabilityGroups,', ',',')
5974 WHILE CHARINDEX(' ,',@AvailabilityGroups) > 0 SET @AvailabilityGroups = REPLACE(@AvailabilityGroups,' ,',',')
5975
5976 SET @AvailabilityGroups = LTRIM(RTRIM(@AvailabilityGroups));
5977
5978 WITH AvailabilityGroups1 (StartPosition, EndPosition, AvailabilityGroupItem) AS
5979 (
5980 SELECT 1 AS StartPosition,
5981 ISNULL(NULLIF(CHARINDEX(',', @AvailabilityGroups, 1), 0), LEN(@AvailabilityGroups) + 1) AS EndPosition,
5982 SUBSTRING(@AvailabilityGroups, 1, ISNULL(NULLIF(CHARINDEX(',', @AvailabilityGroups, 1), 0), LEN(@AvailabilityGroups) + 1) - 1) AS AvailabilityGroupItem
5983 WHERE @AvailabilityGroups IS NOT NULL
5984 UNION ALL
5985 SELECT CAST(EndPosition AS int) + 1 AS StartPosition,
5986 ISNULL(NULLIF(CHARINDEX(',', @AvailabilityGroups, EndPosition + 1), 0), LEN(@AvailabilityGroups) + 1) AS EndPosition,
5987 SUBSTRING(@AvailabilityGroups, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(',', @AvailabilityGroups, EndPosition + 1), 0), LEN(@AvailabilityGroups) + 1) - EndPosition - 1) AS AvailabilityGroupItem
5988 FROM AvailabilityGroups1
5989 WHERE EndPosition < LEN(@AvailabilityGroups) + 1
5990 ),
5991 AvailabilityGroups2 (AvailabilityGroupItem, StartPosition, Selected) AS
5992 (
5993 SELECT CASE WHEN AvailabilityGroupItem LIKE '-%' THEN RIGHT(AvailabilityGroupItem,LEN(AvailabilityGroupItem) - 1) ELSE AvailabilityGroupItem END AS AvailabilityGroupItem,
5994 StartPosition,
5995 CASE WHEN AvailabilityGroupItem LIKE '-%' THEN 0 ELSE 1 END AS Selected
5996 FROM AvailabilityGroups1
5997 ),
5998 AvailabilityGroups3 (AvailabilityGroupItem, StartPosition, Selected) AS
5999 (
6000 SELECT CASE WHEN AvailabilityGroupItem = 'ALL_AVAILABILITY_GROUPS' THEN '%' ELSE AvailabilityGroupItem END AS AvailabilityGroupItem,
6001 StartPosition,
6002 Selected
6003 FROM AvailabilityGroups2
6004 ),
6005 AvailabilityGroups4 (AvailabilityGroupName, StartPosition, Selected) AS
6006 (
6007 SELECT CASE WHEN LEFT(AvailabilityGroupItem,1) = '[' AND RIGHT(AvailabilityGroupItem,1) = ']' THEN PARSENAME(AvailabilityGroupItem,1) ELSE AvailabilityGroupItem END AS AvailabilityGroupItem,
6008 StartPosition,
6009 Selected
6010 FROM AvailabilityGroups3
6011 )
6012 INSERT INTO @SelectedAvailabilityGroups (AvailabilityGroupName, StartPosition, Selected)
6013 SELECT AvailabilityGroupName, StartPosition, Selected
6014 FROM AvailabilityGroups4
6015 OPTION (MAXRECURSION 0)
6016
6017 UPDATE tmpAvailabilityGroups
6018 SET tmpAvailabilityGroups.Selected = SelectedAvailabilityGroups.Selected
6019 FROM @tmpAvailabilityGroups tmpAvailabilityGroups
6020 INNER JOIN @SelectedAvailabilityGroups SelectedAvailabilityGroups
6021 ON tmpAvailabilityGroups.AvailabilityGroupName LIKE REPLACE(SelectedAvailabilityGroups.AvailabilityGroupName,'_','[_]')
6022 WHERE SelectedAvailabilityGroups.Selected = 1
6023
6024 UPDATE tmpAvailabilityGroups
6025 SET tmpAvailabilityGroups.Selected = SelectedAvailabilityGroups.Selected
6026 FROM @tmpAvailabilityGroups tmpAvailabilityGroups
6027 INNER JOIN @SelectedAvailabilityGroups SelectedAvailabilityGroups
6028 ON tmpAvailabilityGroups.AvailabilityGroupName LIKE REPLACE(SelectedAvailabilityGroups.AvailabilityGroupName,'_','[_]')
6029 WHERE SelectedAvailabilityGroups.Selected = 0
6030
6031 UPDATE tmpAvailabilityGroups
6032 SET tmpAvailabilityGroups.StartPosition = SelectedAvailabilityGroups2.StartPosition
6033 FROM @tmpAvailabilityGroups tmpAvailabilityGroups
6034 INNER JOIN (SELECT tmpAvailabilityGroups.AvailabilityGroupName, MIN(SelectedAvailabilityGroups.StartPosition) AS StartPosition
6035 FROM @tmpAvailabilityGroups tmpAvailabilityGroups
6036 INNER JOIN @SelectedAvailabilityGroups SelectedAvailabilityGroups
6037 ON tmpAvailabilityGroups.AvailabilityGroupName LIKE REPLACE(SelectedAvailabilityGroups.AvailabilityGroupName,'_','[_]')
6038 WHERE SelectedAvailabilityGroups.Selected = 1
6039 GROUP BY tmpAvailabilityGroups.AvailabilityGroupName) SelectedAvailabilityGroups2
6040 ON tmpAvailabilityGroups.AvailabilityGroupName = SelectedAvailabilityGroups2.AvailabilityGroupName
6041
6042 UPDATE tmpDatabases
6043 SET tmpDatabases.StartPosition = tmpAvailabilityGroups.StartPosition,
6044 tmpDatabases.Selected = 1
6045 FROM @tmpDatabases tmpDatabases
6046 INNER JOIN @tmpDatabasesAvailabilityGroups tmpDatabasesAvailabilityGroups ON tmpDatabases.DatabaseName = tmpDatabasesAvailabilityGroups.DatabaseName
6047 INNER JOIN @tmpAvailabilityGroups tmpAvailabilityGroups ON tmpDatabasesAvailabilityGroups.AvailabilityGroupName = tmpAvailabilityGroups.AvailabilityGroupName
6048 WHERE tmpAvailabilityGroups.Selected = 1
6049
6050 END
6051
6052 IF @AvailabilityGroups IS NOT NULL AND (NOT EXISTS(SELECT * FROM @SelectedAvailabilityGroups) OR EXISTS(SELECT * FROM @SelectedAvailabilityGroups WHERE AvailabilityGroupName IS NULL OR AvailabilityGroupName = '') OR @Version < 11 OR SERVERPROPERTY('IsHadrEnabled') = 0)
6053 BEGIN
6054 SET @ErrorMessage = 'The value for the parameter @AvailabilityGroups is not supported.'
6055 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
6056 SET @Error = @@ERROR
6057 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
6058 END
6059
6060 IF (@Databases IS NULL AND @AvailabilityGroups IS NULL)
6061 BEGIN
6062 SET @ErrorMessage = 'You need to specify one of the parameters @Databases and @AvailabilityGroups.'
6063 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
6064 SET @Error = @@ERROR
6065 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
6066 END
6067
6068 IF (@Databases IS NOT NULL AND @AvailabilityGroups IS NOT NULL)
6069 BEGIN
6070 SET @ErrorMessage = 'You can only specify one of the parameters @Databases and @AvailabilityGroups.'
6071 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
6072 SET @Error = @@ERROR
6073 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
6074 END
6075
6076 ----------------------------------------------------------------------------------------------------
6077 --// Select indexes //--
6078 ----------------------------------------------------------------------------------------------------
6079
6080 SET @Indexes = REPLACE(@Indexes, CHAR(10), '')
6081 SET @Indexes = REPLACE(@Indexes, CHAR(13), '')
6082
6083 WHILE CHARINDEX(', ',@Indexes) > 0 SET @Indexes = REPLACE(@Indexes,', ',',')
6084 WHILE CHARINDEX(' ,',@Indexes) > 0 SET @Indexes = REPLACE(@Indexes,' ,',',')
6085
6086 SET @Indexes = LTRIM(RTRIM(@Indexes));
6087
6088 WITH Indexes1 (StartPosition, EndPosition, IndexItem) AS
6089 (
6090 SELECT 1 AS StartPosition,
6091 ISNULL(NULLIF(CHARINDEX(',', @Indexes, 1), 0), LEN(@Indexes) + 1) AS EndPosition,
6092 SUBSTRING(@Indexes, 1, ISNULL(NULLIF(CHARINDEX(',', @Indexes, 1), 0), LEN(@Indexes) + 1) - 1) AS IndexItem
6093 WHERE @Indexes IS NOT NULL
6094 UNION ALL
6095 SELECT CAST(EndPosition AS int) + 1 AS StartPosition,
6096 ISNULL(NULLIF(CHARINDEX(',', @Indexes, EndPosition + 1), 0), LEN(@Indexes) + 1) AS EndPosition,
6097 SUBSTRING(@Indexes, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(',', @Indexes, EndPosition + 1), 0), LEN(@Indexes) + 1) - EndPosition - 1) AS IndexItem
6098 FROM Indexes1
6099 WHERE EndPosition < LEN(@Indexes) + 1
6100 ),
6101 Indexes2 (IndexItem, StartPosition, Selected) AS
6102 (
6103 SELECT CASE WHEN IndexItem LIKE '-%' THEN RIGHT(IndexItem,LEN(IndexItem) - 1) ELSE IndexItem END AS IndexItem,
6104 StartPosition,
6105 CASE WHEN IndexItem LIKE '-%' THEN 0 ELSE 1 END AS Selected
6106 FROM Indexes1
6107 ),
6108 Indexes3 (IndexItem, StartPosition, Selected) AS
6109 (
6110 SELECT CASE WHEN IndexItem = 'ALL_INDEXES' THEN '%.%.%.%' ELSE IndexItem END AS IndexItem,
6111 StartPosition,
6112 Selected
6113 FROM Indexes2
6114 ),
6115 Indexes4 (DatabaseName, SchemaName, ObjectName, IndexName, StartPosition, Selected) AS
6116 (
6117 SELECT CASE WHEN PARSENAME(IndexItem,4) IS NULL THEN PARSENAME(IndexItem,3) ELSE PARSENAME(IndexItem,4) END AS DatabaseName,
6118 CASE WHEN PARSENAME(IndexItem,4) IS NULL THEN PARSENAME(IndexItem,2) ELSE PARSENAME(IndexItem,3) END AS SchemaName,
6119 CASE WHEN PARSENAME(IndexItem,4) IS NULL THEN PARSENAME(IndexItem,1) ELSE PARSENAME(IndexItem,2) END AS ObjectName,
6120 CASE WHEN PARSENAME(IndexItem,4) IS NULL THEN '%' ELSE PARSENAME(IndexItem,1) END AS IndexName,
6121 StartPosition,
6122 Selected
6123 FROM Indexes3
6124 )
6125 INSERT INTO @SelectedIndexes (DatabaseName, SchemaName, ObjectName, IndexName, StartPosition, Selected)
6126 SELECT DatabaseName, SchemaName, ObjectName, IndexName, StartPosition, Selected
6127 FROM Indexes4
6128 OPTION (MAXRECURSION 0);
6129
6130 ----------------------------------------------------------------------------------------------------
6131 --// Select actions //--
6132 ----------------------------------------------------------------------------------------------------
6133
6134 WITH FragmentationLow (StartPosition, EndPosition, [Action]) AS
6135 (
6136 SELECT 1 AS StartPosition,
6137 ISNULL(NULLIF(CHARINDEX(',', @FragmentationLow, 1), 0), LEN(@FragmentationLow) + 1) AS EndPosition,
6138 SUBSTRING(@FragmentationLow, 1, ISNULL(NULLIF(CHARINDEX(',', @FragmentationLow, 1), 0), LEN(@FragmentationLow) + 1) - 1) AS [Action]
6139 WHERE @FragmentationLow IS NOT NULL
6140 UNION ALL
6141 SELECT CAST(EndPosition AS int) + 1 AS StartPosition,
6142 ISNULL(NULLIF(CHARINDEX(',', @FragmentationLow, EndPosition + 1), 0), LEN(@FragmentationLow) + 1) AS EndPosition,
6143 SUBSTRING(@FragmentationLow, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(',', @FragmentationLow, EndPosition + 1), 0), LEN(@FragmentationLow) + 1) - EndPosition - 1) AS [Action]
6144 FROM FragmentationLow
6145 WHERE EndPosition < LEN(@FragmentationLow) + 1
6146 )
6147 INSERT INTO @ActionsPreferred(FragmentationGroup, [Priority], [Action])
6148 SELECT 'Low' AS FragmentationGroup,
6149 ROW_NUMBER() OVER(ORDER BY StartPosition ASC) AS [Priority],
6150 [Action]
6151 FROM FragmentationLow
6152 OPTION (MAXRECURSION 0);
6153
6154 WITH FragmentationMedium (StartPosition, EndPosition, [Action]) AS
6155 (
6156 SELECT 1 AS StartPosition,
6157 ISNULL(NULLIF(CHARINDEX(',', @FragmentationMedium, 1), 0), LEN(@FragmentationMedium) + 1) AS EndPosition,
6158 SUBSTRING(@FragmentationMedium, 1, ISNULL(NULLIF(CHARINDEX(',', @FragmentationMedium, 1), 0), LEN(@FragmentationMedium) + 1) - 1) AS [Action]
6159 WHERE @FragmentationMedium IS NOT NULL
6160 UNION ALL
6161 SELECT CAST(EndPosition AS int) + 1 AS StartPosition,
6162 ISNULL(NULLIF(CHARINDEX(',', @FragmentationMedium, EndPosition + 1), 0), LEN(@FragmentationMedium) + 1) AS EndPosition,
6163 SUBSTRING(@FragmentationMedium, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(',', @FragmentationMedium, EndPosition + 1), 0), LEN(@FragmentationMedium) + 1) - EndPosition - 1) AS [Action]
6164 FROM FragmentationMedium
6165 WHERE EndPosition < LEN(@FragmentationMedium) + 1
6166 )
6167 INSERT INTO @ActionsPreferred(FragmentationGroup, [Priority], [Action])
6168 SELECT 'Medium' AS FragmentationGroup,
6169 ROW_NUMBER() OVER(ORDER BY StartPosition ASC) AS [Priority],
6170 [Action]
6171 FROM FragmentationMedium
6172 OPTION (MAXRECURSION 0);
6173
6174 WITH FragmentationHigh (StartPosition, EndPosition, [Action]) AS
6175 (
6176 SELECT 1 AS StartPosition,
6177 ISNULL(NULLIF(CHARINDEX(',', @FragmentationHigh, 1), 0), LEN(@FragmentationHigh) + 1) AS EndPosition,
6178 SUBSTRING(@FragmentationHigh, 1, ISNULL(NULLIF(CHARINDEX(',', @FragmentationHigh, 1), 0), LEN(@FragmentationHigh) + 1) - 1) AS [Action]
6179 WHERE @FragmentationHigh IS NOT NULL
6180 UNION ALL
6181 SELECT CAST(EndPosition AS int) + 1 AS StartPosition,
6182 ISNULL(NULLIF(CHARINDEX(',', @FragmentationHigh, EndPosition + 1), 0), LEN(@FragmentationHigh) + 1) AS EndPosition,
6183 SUBSTRING(@FragmentationHigh, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(',', @FragmentationHigh, EndPosition + 1), 0), LEN(@FragmentationHigh) + 1) - EndPosition - 1) AS [Action]
6184 FROM FragmentationHigh
6185 WHERE EndPosition < LEN(@FragmentationHigh) + 1
6186 )
6187 INSERT INTO @ActionsPreferred(FragmentationGroup, [Priority], [Action])
6188 SELECT 'High' AS FragmentationGroup,
6189 ROW_NUMBER() OVER(ORDER BY StartPosition ASC) AS [Priority],
6190 [Action]
6191 FROM FragmentationHigh
6192 OPTION (MAXRECURSION 0)
6193
6194 ----------------------------------------------------------------------------------------------------
6195 --// Check input parameters //--
6196 ----------------------------------------------------------------------------------------------------
6197
6198 IF EXISTS (SELECT [Action] FROM @ActionsPreferred WHERE FragmentationGroup = 'Low' AND [Action] NOT IN(SELECT * FROM @Actions))
6199 OR EXISTS(SELECT * FROM @ActionsPreferred WHERE FragmentationGroup = 'Low' GROUP BY [Action] HAVING COUNT(*) > 1)
6200 BEGIN
6201 SET @ErrorMessage = 'The value for the parameter @FragmentationLow is not supported.'
6202 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
6203 SET @Error = @@ERROR
6204 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
6205 END
6206
6207 IF EXISTS (SELECT [Action] FROM @ActionsPreferred WHERE FragmentationGroup = 'Medium' AND [Action] NOT IN(SELECT * FROM @Actions))
6208 OR EXISTS(SELECT * FROM @ActionsPreferred WHERE FragmentationGroup = 'Medium' GROUP BY [Action] HAVING COUNT(*) > 1)
6209 BEGIN
6210 SET @ErrorMessage = 'The value for the parameter @FragmentationMedium is not supported.'
6211 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
6212 SET @Error = @@ERROR
6213 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
6214 END
6215
6216 IF EXISTS (SELECT [Action] FROM @ActionsPreferred WHERE FragmentationGroup = 'High' AND [Action] NOT IN(SELECT * FROM @Actions))
6217 OR EXISTS(SELECT * FROM @ActionsPreferred WHERE FragmentationGroup = 'High' GROUP BY [Action] HAVING COUNT(*) > 1)
6218 BEGIN
6219 SET @ErrorMessage = 'The value for the parameter @FragmentationHigh is not supported.'
6220 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
6221 SET @Error = @@ERROR
6222 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
6223 END
6224
6225 IF @FragmentationLevel1 <= 0 OR @FragmentationLevel1 >= 100 OR @FragmentationLevel1 >= @FragmentationLevel2 OR @FragmentationLevel1 IS NULL
6226 BEGIN
6227 SET @ErrorMessage = 'The value for the parameter @FragmentationLevel1 is not supported.'
6228 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
6229 SET @Error = @@ERROR
6230 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
6231 END
6232
6233 IF @FragmentationLevel2 <= 0 OR @FragmentationLevel2 >= 100 OR @FragmentationLevel2 <= @FragmentationLevel1 OR @FragmentationLevel2 IS NULL
6234 BEGIN
6235 SET @ErrorMessage = 'The value for the parameter @FragmentationLevel2 is not supported.'
6236 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
6237 SET @Error = @@ERROR
6238 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
6239 END
6240
6241 IF @MinNumberOfPages < 0 OR @MinNumberOfPages IS NULL
6242 BEGIN
6243 SET @ErrorMessage = 'The value for the parameter @MinNumberOfPages is not supported.'
6244 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
6245 SET @Error = @@ERROR
6246 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
6247 END
6248
6249 IF @MaxNumberOfPages < 0
6250 BEGIN
6251 SET @ErrorMessage = 'The value for the parameter @MaxNumberOfPages is not supported.'
6252 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
6253 SET @Error = @@ERROR
6254 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
6255 END
6256
6257 IF @SortInTempdb NOT IN('Y','N') OR @SortInTempdb IS NULL
6258 BEGIN
6259 SET @ErrorMessage = 'The value for the parameter @SortInTempdb is not supported.'
6260 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
6261 SET @Error = @@ERROR
6262 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
6263 END
6264
6265 IF @MaxDOP < 0 OR @MaxDOP > 64
6266 BEGIN
6267 SET @ErrorMessage = 'The value for the parameter @MaxDOP is not supported.'
6268 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
6269 SET @Error = @@ERROR
6270 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
6271 END
6272
6273 IF @FillFactor <= 0 OR @FillFactor > 100
6274 BEGIN
6275 SET @ErrorMessage = 'The value for the parameter @FillFactor is not supported.'
6276 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
6277 SET @Error = @@ERROR
6278 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
6279 END
6280
6281 IF @PadIndex NOT IN('Y','N')
6282 BEGIN
6283 SET @ErrorMessage = 'The value for the parameter @PadIndex is not supported.'
6284 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
6285 SET @Error = @@ERROR
6286 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
6287 END
6288
6289 IF @LOBCompaction NOT IN('Y','N') OR @LOBCompaction IS NULL
6290 BEGIN
6291 SET @ErrorMessage = 'The value for the parameter @LOBCompaction is not supported.'
6292 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
6293 SET @Error = @@ERROR
6294 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
6295 END
6296
6297 IF @UpdateStatistics NOT IN('ALL','COLUMNS','INDEX')
6298 BEGIN
6299 SET @ErrorMessage = 'The value for the parameter @UpdateStatistics is not supported.'
6300 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
6301 SET @Error = @@ERROR
6302 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
6303 END
6304
6305 IF @OnlyModifiedStatistics NOT IN('Y','N') OR @OnlyModifiedStatistics IS NULL
6306 BEGIN
6307 SET @ErrorMessage = 'The value for the parameter @OnlyModifiedStatistics is not supported.'
6308 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
6309 SET @Error = @@ERROR
6310 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
6311 END
6312
6313 IF @StatisticsModificationLevel <= 0 OR @StatisticsModificationLevel > 100
6314 BEGIN
6315 SET @ErrorMessage = 'The value for the parameter @StatisticsModificationLevel is not supported.'
6316 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
6317 SET @Error = @@ERROR
6318 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
6319 END
6320
6321 IF @OnlyModifiedStatistics = 'Y' AND @StatisticsModificationLevel IS NOT NULL
6322 BEGIN
6323 SET @ErrorMessage = 'You can only specify one of the parameters @OnlyModifiedStatistics and @StatisticsModificationLevel.'
6324 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
6325 SET @Error = @@ERROR
6326 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
6327 END
6328
6329 IF @StatisticsSample <= 0 OR @StatisticsSample > 100
6330 BEGIN
6331 SET @ErrorMessage = 'The value for the parameter @StatisticsSample is not supported.'
6332 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
6333 SET @Error = @@ERROR
6334 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
6335 END
6336
6337 IF @StatisticsResample NOT IN('Y','N') OR @StatisticsResample IS NULL OR (@StatisticsResample = 'Y' AND @StatisticsSample IS NOT NULL)
6338 BEGIN
6339 SET @ErrorMessage = 'The value for the parameter @StatisticsResample is not supported.'
6340 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
6341 SET @Error = @@ERROR
6342 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
6343 END
6344
6345 IF @PartitionLevel NOT IN('Y','N') OR @PartitionLevel IS NULL
6346 BEGIN
6347 SET @ErrorMessage = 'The value for the parameter @PartitionLevel is not supported.'
6348 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
6349 SET @Error = @@ERROR
6350 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
6351 END
6352
6353 IF @MSShippedObjects NOT IN('Y','N') OR @MSShippedObjects IS NULL
6354 BEGIN
6355 SET @ErrorMessage = 'The value for the parameter @MSShippedObjects is not supported.'
6356 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
6357 SET @Error = @@ERROR
6358 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
6359 END
6360
6361 IF EXISTS(SELECT * FROM @SelectedIndexes WHERE DatabaseName IS NULL OR SchemaName IS NULL OR ObjectName IS NULL OR IndexName IS NULL) OR (@Indexes IS NOT NULL AND NOT EXISTS(SELECT * FROM @SelectedIndexes))
6362 BEGIN
6363 SET @ErrorMessage = 'The value for the parameter @Indexes is not supported.'
6364 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
6365 SET @Error = @@ERROR
6366 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
6367 END
6368
6369 IF @TimeLimit < 0
6370 BEGIN
6371 SET @ErrorMessage = 'The value for the parameter @TimeLimit is not supported.'
6372 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
6373 SET @Error = @@ERROR
6374 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
6375 END
6376
6377 IF @Delay < 0
6378 BEGIN
6379 SET @ErrorMessage = 'The value for the parameter @Delay is not supported.'
6380 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
6381 SET @Error = @@ERROR
6382 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
6383 END
6384
6385 IF @WaitAtLowPriorityMaxDuration < 0 OR (@WaitAtLowPriorityMaxDuration IS NOT NULL AND @Version < 12) OR (@WaitAtLowPriorityMaxDuration IS NOT NULL AND @WaitAtLowPriorityAbortAfterWait IS NULL) OR (@WaitAtLowPriorityMaxDuration IS NULL AND @WaitAtLowPriorityAbortAfterWait IS NOT NULL)
6386 BEGIN
6387 SET @ErrorMessage = 'The value for the parameter @WaitAtLowPriorityMaxDuration is not supported.'
6388 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
6389 SET @Error = @@ERROR
6390 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
6391 END
6392
6393 IF @WaitAtLowPriorityAbortAfterWait NOT IN('NONE','SELF','BLOCKERS') OR (@WaitAtLowPriorityAbortAfterWait IS NOT NULL AND @Version < 12) OR (@WaitAtLowPriorityAbortAfterWait IS NOT NULL AND @WaitAtLowPriorityMaxDuration IS NULL) OR (@WaitAtLowPriorityAbortAfterWait IS NULL AND @WaitAtLowPriorityMaxDuration IS NOT NULL)
6394 BEGIN
6395 SET @ErrorMessage = 'The value for the parameter @WaitAtLowPriorityAbortAfterWait is not supported.'
6396 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
6397 SET @Error = @@ERROR
6398 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
6399 END
6400
6401 IF @Resumable NOT IN('Y','N') OR @Resumable IS NULL OR (@Resumable = 'Y' AND NOT (@Version >= 14 OR SERVERPROPERTY('EngineEdition') IN (5,8)))
6402 BEGIN
6403 SET @ErrorMessage = 'The value for the parameter @Resumable is not supported.'
6404 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
6405 SET @Error = @@ERROR
6406 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
6407 END
6408
6409 IF @Resumable = 'Y' AND @SortInTempdb = 'Y'
6410 BEGIN
6411 SET @ErrorMessage = 'You can only specify one of the parameters @Resumable and @SortInTempdb.'
6412 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
6413 SET @Error = @@ERROR
6414 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
6415 END
6416
6417 IF @LockTimeout < 0
6418 BEGIN
6419 SET @ErrorMessage = 'The value for the parameter @LockTimeout is not supported.'
6420 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
6421 SET @Error = @@ERROR
6422 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
6423 END
6424
6425 IF @LockMessageSeverity NOT IN(10,16)
6426 BEGIN
6427 SET @ErrorMessage = 'The value for the parameter @LockMessageSeverity is not supported.'
6428 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
6429 SET @Error = @@ERROR
6430 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
6431 END
6432
6433 IF @DatabaseOrder NOT IN('DATABASE_NAME_ASC','DATABASE_NAME_DESC','DATABASE_SIZE_ASC','DATABASE_SIZE_DESC') OR (@DatabaseOrder IS NOT NULL AND SERVERPROPERTY('EngineEdition') = 5)
6434 BEGIN
6435 SET @ErrorMessage = 'The value for the parameter @DatabaseOrder is not supported.'
6436 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
6437 SET @Error = @@ERROR
6438 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
6439 END
6440
6441 IF @DatabasesInParallel NOT IN('Y','N') OR @DatabasesInParallel IS NULL OR (@DatabasesInParallel = 'Y' AND SERVERPROPERTY('EngineEdition') = 5)
6442 BEGIN
6443 SET @ErrorMessage = 'The value for the parameter @DatabasesInParallel is not supported.'
6444 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
6445 SET @Error = @@ERROR
6446 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
6447 END
6448
6449 IF @LogToTable NOT IN('Y','N') OR @LogToTable IS NULL
6450 BEGIN
6451 SET @ErrorMessage = 'The value for the parameter @LogToTable is not supported.'
6452 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
6453 SET @Error = @@ERROR
6454 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
6455 END
6456
6457 IF @Execute NOT IN('Y','N') OR @Execute IS NULL
6458 BEGIN
6459 SET @ErrorMessage = 'The value for the parameter @Execute is not supported.'
6460 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
6461 SET @Error = @@ERROR
6462 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
6463 END
6464
6465 IF @Error <> 0
6466 BEGIN
6467 SET @ErrorMessage = 'The documentation is available at https://ola.hallengren.com/sql-server-index-and-statistics-maintenance.html.'
6468 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
6469 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
6470 SET @ReturnCode = @Error
6471 GOTO Logging
6472 END
6473
6474 ----------------------------------------------------------------------------------------------------
6475 --// Check that selected databases and availability groups exist //--
6476 ----------------------------------------------------------------------------------------------------
6477
6478 SET @ErrorMessage = ''
6479 SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + ', '
6480 FROM @SelectedDatabases
6481 WHERE DatabaseName NOT LIKE '%[%]%'
6482 AND DatabaseName NOT IN (SELECT DatabaseName FROM @tmpDatabases)
6483 IF @@ROWCOUNT > 0
6484 BEGIN
6485 SET @ErrorMessage = 'The following databases in the @Databases parameter do not exist: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.'
6486 RAISERROR('%s',10,1,@ErrorMessage) WITH NOWAIT
6487 SET @Error = @@ERROR
6488 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
6489 END
6490
6491 SET @ErrorMessage = ''
6492 SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + ', '
6493 FROM @SelectedIndexes
6494 WHERE DatabaseName NOT LIKE '%[%]%'
6495 AND DatabaseName NOT IN (SELECT DatabaseName FROM @tmpDatabases)
6496 IF @@ROWCOUNT > 0
6497 BEGIN
6498 SET @ErrorMessage = 'The following databases in the @Indexes parameter do not exist: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.'
6499 RAISERROR('%s',10,1,@ErrorMessage) WITH NOWAIT
6500 SET @Error = @@ERROR
6501 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
6502 END
6503
6504 SET @ErrorMessage = ''
6505 SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(AvailabilityGroupName) + ', '
6506 FROM @SelectedAvailabilityGroups
6507 WHERE AvailabilityGroupName NOT LIKE '%[%]%'
6508 AND AvailabilityGroupName NOT IN (SELECT AvailabilityGroupName FROM @tmpAvailabilityGroups)
6509 IF @@ROWCOUNT > 0
6510 BEGIN
6511 SET @ErrorMessage = 'The following availability groups do not exist: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.'
6512 RAISERROR('%s',10,1,@ErrorMessage) WITH NOWAIT
6513 SET @Error = @@ERROR
6514 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
6515 END
6516
6517 SET @ErrorMessage = ''
6518 SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + ', '
6519 FROM @SelectedIndexes
6520 WHERE DatabaseName NOT LIKE '%[%]%'
6521 AND DatabaseName IN (SELECT DatabaseName FROM @tmpDatabases)
6522 AND DatabaseName NOT IN (SELECT DatabaseName FROM @tmpDatabases WHERE Selected = 1)
6523 IF @@ROWCOUNT > 0
6524 BEGIN
6525 SET @ErrorMessage = 'The following databases have been selected in the @Indexes parameter, but not in the @Databases or @AvailabilityGroups parameters: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.'
6526 RAISERROR('%s',10,1,@ErrorMessage) WITH NOWAIT
6527 SET @Error = @@ERROR
6528 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
6529 END
6530
6531 ----------------------------------------------------------------------------------------------------
6532 --// Should statistics be updated on the partition level? //--
6533 ----------------------------------------------------------------------------------------------------
6534
6535 SET @PartitionLevelStatistics = CASE WHEN @PartitionLevel = 'Y' AND ((@Version >= 12.05 AND @Version < 13) OR @Version >= 13.04422 OR SERVERPROPERTY('EngineEdition') IN (5,8)) THEN 1 ELSE 0 END
6536
6537 ----------------------------------------------------------------------------------------------------
6538 --// Update database order //--
6539 ----------------------------------------------------------------------------------------------------
6540
6541 IF @DatabaseOrder IN('DATABASE_SIZE_ASC','DATABASE_SIZE_DESC')
6542 BEGIN
6543 UPDATE tmpDatabases
6544 SET DatabaseSize = (SELECT SUM(size) FROM sys.master_files WHERE [type] = 0 AND database_id = DB_ID(tmpDatabases.DatabaseName))
6545 FROM @tmpDatabases tmpDatabases
6546 END
6547
6548 IF @DatabaseOrder IS NULL
6549 BEGIN
6550 WITH tmpDatabases AS (
6551 SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY StartPosition ASC, DatabaseName ASC) AS RowNumber
6552 FROM @tmpDatabases tmpDatabases
6553 WHERE Selected = 1
6554 )
6555 UPDATE tmpDatabases
6556 SET [Order] = RowNumber
6557 END
6558 ELSE
6559 IF @DatabaseOrder = 'DATABASE_NAME_ASC'
6560 BEGIN
6561 WITH tmpDatabases AS (
6562 SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY DatabaseName ASC) AS RowNumber
6563 FROM @tmpDatabases tmpDatabases
6564 WHERE Selected = 1
6565 )
6566 UPDATE tmpDatabases
6567 SET [Order] = RowNumber
6568 END
6569 ELSE
6570 IF @DatabaseOrder = 'DATABASE_NAME_DESC'
6571 BEGIN
6572 WITH tmpDatabases AS (
6573 SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY DatabaseName DESC) AS RowNumber
6574 FROM @tmpDatabases tmpDatabases
6575 WHERE Selected = 1
6576 )
6577 UPDATE tmpDatabases
6578 SET [Order] = RowNumber
6579 END
6580 ELSE
6581 IF @DatabaseOrder = 'DATABASE_SIZE_ASC'
6582 BEGIN
6583 WITH tmpDatabases AS (
6584 SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY DatabaseSize ASC) AS RowNumber
6585 FROM @tmpDatabases tmpDatabases
6586 WHERE Selected = 1
6587 )
6588 UPDATE tmpDatabases
6589 SET [Order] = RowNumber
6590 END
6591 ELSE
6592 IF @DatabaseOrder = 'DATABASE_SIZE_DESC'
6593 BEGIN
6594 WITH tmpDatabases AS (
6595 SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY DatabaseSize DESC) AS RowNumber
6596 FROM @tmpDatabases tmpDatabases
6597 WHERE Selected = 1
6598 )
6599 UPDATE tmpDatabases
6600 SET [Order] = RowNumber
6601 END
6602
6603 ----------------------------------------------------------------------------------------------------
6604 --// Update the queue //--
6605 ----------------------------------------------------------------------------------------------------
6606
6607 IF @DatabasesInParallel = 'Y'
6608 BEGIN
6609
6610 BEGIN TRY
6611
6612 SELECT @QueueID = QueueID
6613 FROM dbo.[Queue]
6614 WHERE SchemaName = @SchemaName
6615 AND ObjectName = @ObjectName
6616 AND [Parameters] = @Parameters
6617
6618 IF @QueueID IS NULL
6619 BEGIN
6620 BEGIN TRANSACTION
6621
6622 SELECT @QueueID = QueueID
6623 FROM dbo.[Queue] WITH (UPDLOCK, TABLOCK)
6624 WHERE SchemaName = @SchemaName
6625 AND ObjectName = @ObjectName
6626 AND [Parameters] = @Parameters
6627
6628 IF @QueueID IS NULL
6629 BEGIN
6630 INSERT INTO dbo.[Queue] (SchemaName, ObjectName, [Parameters])
6631 SELECT @SchemaName, @ObjectName, @Parameters
6632
6633 SET @QueueID = SCOPE_IDENTITY()
6634 END
6635
6636 COMMIT TRANSACTION
6637 END
6638
6639 BEGIN TRANSACTION
6640
6641 UPDATE [Queue]
6642 SET QueueStartTime = GETDATE(),
6643 SessionID = @@SPID,
6644 RequestID = (SELECT request_id FROM sys.dm_exec_requests WHERE session_id = @@SPID),
6645 RequestStartTime = (SELECT start_time FROM sys.dm_exec_requests WHERE session_id = @@SPID)
6646 FROM dbo.[Queue] [Queue]
6647 WHERE QueueID = @QueueID
6648 AND NOT EXISTS (SELECT *
6649 FROM sys.dm_exec_requests
6650 WHERE session_id = [Queue].SessionID
6651 AND request_id = [Queue].RequestID
6652 AND start_time = [Queue].RequestStartTime)
6653 AND NOT EXISTS (SELECT *
6654 FROM dbo.QueueDatabase QueueDatabase
6655 INNER JOIN sys.dm_exec_requests ON QueueDatabase.SessionID = session_id AND QueueDatabase.RequestID = request_id AND QueueDatabase.RequestStartTime = start_time
6656 WHERE QueueDatabase.QueueID = @QueueID)
6657
6658 IF @@ROWCOUNT = 1
6659 BEGIN
6660 INSERT INTO dbo.QueueDatabase (QueueID, DatabaseName)
6661 SELECT @QueueID AS QueueID,
6662 DatabaseName
6663 FROM @tmpDatabases tmpDatabases
6664 WHERE Selected = 1
6665 AND NOT EXISTS (SELECT * FROM dbo.QueueDatabase WHERE DatabaseName = tmpDatabases.DatabaseName AND QueueID = @QueueID)
6666
6667 DELETE QueueDatabase
6668 FROM dbo.QueueDatabase QueueDatabase
6669 WHERE QueueID = @QueueID
6670 AND NOT EXISTS (SELECT * FROM @tmpDatabases tmpDatabases WHERE DatabaseName = QueueDatabase.DatabaseName AND Selected = 1)
6671
6672 UPDATE QueueDatabase
6673 SET DatabaseOrder = tmpDatabases.[Order]
6674 FROM dbo.QueueDatabase QueueDatabase
6675 INNER JOIN @tmpDatabases tmpDatabases ON QueueDatabase.DatabaseName = tmpDatabases.DatabaseName
6676 WHERE QueueID = @QueueID
6677 END
6678
6679 COMMIT TRANSACTION
6680
6681 SELECT @QueueStartTime = QueueStartTime
6682 FROM dbo.[Queue]
6683 WHERE QueueID = @QueueID
6684
6685 END TRY
6686
6687 BEGIN CATCH
6688 IF XACT_STATE() <> 0
6689 BEGIN
6690 ROLLBACK TRANSACTION
6691 END
6692 SET @ErrorMessage = 'Msg ' + CAST(ERROR_NUMBER() AS nvarchar) + ', ' + ISNULL(ERROR_MESSAGE(),'')
6693 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
6694 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
6695 SET @ReturnCode = ERROR_NUMBER()
6696 GOTO Logging
6697 END CATCH
6698
6699 END
6700
6701 ----------------------------------------------------------------------------------------------------
6702 --// Execute commands //--
6703 ----------------------------------------------------------------------------------------------------
6704
6705 WHILE (1 = 1)
6706 BEGIN
6707
6708 IF @DatabasesInParallel = 'Y'
6709 BEGIN
6710 UPDATE QueueDatabase
6711 SET DatabaseStartTime = NULL,
6712 SessionID = NULL,
6713 RequestID = NULL,
6714 RequestStartTime = NULL
6715 FROM dbo.QueueDatabase QueueDatabase
6716 WHERE QueueID = @QueueID
6717 AND DatabaseStartTime IS NOT NULL
6718 AND DatabaseEndTime IS NULL
6719 AND NOT EXISTS (SELECT * FROM sys.dm_exec_requests WHERE session_id = QueueDatabase.SessionID AND request_id = QueueDatabase.RequestID AND start_time = QueueDatabase.RequestStartTime)
6720
6721 UPDATE QueueDatabase
6722 SET DatabaseStartTime = GETDATE(),
6723 DatabaseEndTime = NULL,
6724 SessionID = @@SPID,
6725 RequestID = (SELECT request_id FROM sys.dm_exec_requests WHERE session_id = @@SPID),
6726 RequestStartTime = (SELECT start_time FROM sys.dm_exec_requests WHERE session_id = @@SPID),
6727 @CurrentDatabaseName = DatabaseName
6728 FROM (SELECT TOP 1 DatabaseStartTime,
6729 DatabaseEndTime,
6730 SessionID,
6731 RequestID,
6732 RequestStartTime,
6733 DatabaseName
6734 FROM dbo.QueueDatabase
6735 WHERE QueueID = @QueueID
6736 AND (DatabaseStartTime < @QueueStartTime OR DatabaseStartTime IS NULL)
6737 AND NOT (DatabaseStartTime IS NOT NULL AND DatabaseEndTime IS NULL)
6738 ORDER BY DatabaseOrder ASC
6739 ) QueueDatabase
6740 END
6741 ELSE
6742 BEGIN
6743 SELECT TOP 1 @CurrentDBID = ID,
6744 @CurrentDatabaseName = DatabaseName
6745 FROM @tmpDatabases
6746 WHERE Selected = 1
6747 AND Completed = 0
6748 ORDER BY [Order] ASC
6749 END
6750
6751 IF @@ROWCOUNT = 0
6752 BEGIN
6753 BREAK
6754 END
6755
6756 SET @CurrentDatabaseID = DB_ID(@CurrentDatabaseName)
6757
6758 IF DATABASEPROPERTYEX(@CurrentDatabaseName,'Status') = 'ONLINE' AND SERVERPROPERTY('EngineEdition') <> 5
6759 BEGIN
6760 IF EXISTS (SELECT * FROM sys.database_recovery_status WHERE database_id = @CurrentDatabaseID AND database_guid IS NOT NULL)
6761 BEGIN
6762 SET @CurrentIsDatabaseAccessible = 1
6763 END
6764 ELSE
6765 BEGIN
6766 SET @CurrentIsDatabaseAccessible = 0
6767 END
6768 END
6769
6770 IF @Version >= 11 AND SERVERPROPERTY('IsHadrEnabled') = 1
6771 BEGIN
6772 SELECT @CurrentAvailabilityGroup = availability_groups.name,
6773 @CurrentAvailabilityGroupRole = dm_hadr_availability_replica_states.role_desc
6774 FROM sys.databases databases
6775 INNER JOIN sys.dm_hadr_availability_replica_states dm_hadr_availability_replica_states ON databases.replica_id = dm_hadr_availability_replica_states.replica_id
6776 INNER JOIN sys.availability_groups availability_groups ON dm_hadr_availability_replica_states.group_id = availability_groups.group_id
6777 WHERE databases.name = @CurrentDatabaseName
6778 END
6779
6780 IF SERVERPROPERTY('EngineEdition') <> 5
6781 BEGIN
6782 SELECT @CurrentDatabaseMirroringRole = UPPER(mirroring_role_desc)
6783 FROM sys.database_mirroring
6784 WHERE database_id = @CurrentDatabaseID
6785 END
6786
6787 SELECT @CurrentIsReadOnly = is_read_only
6788 FROM sys.databases
6789 WHERE name = @CurrentDatabaseName
6790
6791 SET @DatabaseMessage = 'Date and time: ' + CONVERT(nvarchar,GETDATE(),120)
6792 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
6793
6794 SET @DatabaseMessage = 'Database: ' + QUOTENAME(@CurrentDatabaseName)
6795 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
6796
6797 SET @DatabaseMessage = 'Status: ' + CAST(DATABASEPROPERTYEX(@CurrentDatabaseName,'Status') AS nvarchar)
6798 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
6799
6800 SET @DatabaseMessage = 'Standby: ' + CASE WHEN DATABASEPROPERTYEX(@CurrentDatabaseName,'IsInStandBy') = 1 THEN 'Yes' ELSE 'No' END
6801 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
6802
6803 SET @DatabaseMessage = 'Updateability: ' + CASE WHEN @CurrentIsReadOnly = 1 THEN 'READ_ONLY' WHEN @CurrentIsReadOnly = 0 THEN 'READ_WRITE' END
6804 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
6805
6806 SET @DatabaseMessage = 'User access: ' + CAST(DATABASEPROPERTYEX(@CurrentDatabaseName,'UserAccess') AS nvarchar)
6807 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
6808
6809 IF @CurrentIsDatabaseAccessible IS NOT NULL
6810 BEGIN
6811 SET @DatabaseMessage = 'Is accessible: ' + CASE WHEN @CurrentIsDatabaseAccessible = 1 THEN 'Yes' ELSE 'No' END
6812 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
6813 END
6814
6815 SET @DatabaseMessage = 'Recovery model: ' + CAST(DATABASEPROPERTYEX(@CurrentDatabaseName,'Recovery') AS nvarchar)
6816 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
6817
6818 IF @CurrentAvailabilityGroup IS NOT NULL
6819 BEGIN
6820 SET @DatabaseMessage = 'Availability group: ' + ISNULL(@CurrentAvailabilityGroup,'N/A')
6821 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
6822
6823 SET @DatabaseMessage = 'Availability group role: ' + ISNULL(@CurrentAvailabilityGroupRole,'N/A')
6824 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
6825 END
6826
6827 IF @CurrentDatabaseMirroringRole IS NOT NULL
6828 BEGIN
6829 SET @DatabaseMessage = 'Database mirroring role: ' + @CurrentDatabaseMirroringRole
6830 RAISERROR('%s',10,1,@DatabaseMessage) WITH NOWAIT
6831 END
6832
6833 RAISERROR('',10,1) WITH NOWAIT
6834
6835 IF DATABASEPROPERTYEX(@CurrentDatabaseName,'Status') = 'ONLINE'
6836 AND (@CurrentIsDatabaseAccessible = 1 OR @CurrentIsDatabaseAccessible IS NULL)
6837 AND DATABASEPROPERTYEX(@CurrentDatabaseName,'Updateability') = 'READ_WRITE'
6838 BEGIN
6839
6840 -- Select indexes in the current database
6841 IF (EXISTS(SELECT * FROM @ActionsPreferred) OR @UpdateStatistics IS NOT NULL) AND (GETDATE() < DATEADD(ss,@TimeLimit,@StartTime) OR @TimeLimit IS NULL)
6842 BEGIN
6843 SET @CurrentCommand01 = 'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;'
6844 + 'USE ' + QUOTENAME(@CurrentDatabaseName) + ';'
6845 + ' SELECT SchemaID, SchemaName, ObjectID, ObjectName, ObjectType, IsMemoryOptimized, IndexID, IndexName, IndexType, AllowPageLocks, IsImageText, IsNewLOB, IsFileStream, IsColumnStore, IsComputed, IsTimestamp, OnReadOnlyFileGroup, ResumableIndexOperation, StatisticsID, StatisticsName, NoRecompute, IsIncremental, PartitionID, PartitionNumber, PartitionCount, [Order], Selected, Completed'
6846 + ' FROM ('
6847
6848 IF EXISTS(SELECT * FROM @ActionsPreferred) OR @UpdateStatistics IN('ALL','INDEX')
6849 BEGIN
6850 SET @CurrentCommand01 = @CurrentCommand01 + 'SELECT schemas.[schema_id] AS SchemaID'
6851 + ', schemas.[name] AS SchemaName'
6852 + ', objects.[object_id] AS ObjectID'
6853 + ', objects.[name] AS ObjectName'
6854 + ', RTRIM(objects.[type]) AS ObjectType'
6855 + ', ' + CASE WHEN @Version >= 12 THEN 'tables.is_memory_optimized' ELSE '0' END + ' AS IsMemoryOptimized'
6856 + ', indexes.index_id AS IndexID'
6857 + ', indexes.[name] AS IndexName'
6858 + ', indexes.[type] AS IndexType'
6859 + ', indexes.allow_page_locks AS AllowPageLocks'
6860
6861 + ', CASE WHEN indexes.[type] = 1 AND EXISTS(SELECT * FROM sys.columns columns INNER JOIN sys.types types ON columns.system_type_id = types.user_type_id WHERE columns.[object_id] = objects.object_id AND types.name IN(''image'',''text'',''ntext'')) THEN 1 ELSE 0 END AS IsImageText'
6862
6863 + ', CASE WHEN indexes.[type] = 1 AND EXISTS(SELECT * FROM sys.columns columns INNER JOIN sys.types types ON columns.system_type_id = types.user_type_id OR (columns.user_type_id = types.user_type_id AND types.is_assembly_type = 1) WHERE columns.[object_id] = objects.object_id AND (types.name IN(''xml'') OR (types.name IN(''varchar'',''nvarchar'',''varbinary'') AND columns.max_length = -1) OR (types.is_assembly_type = 1 AND columns.max_length = -1))) THEN 1'
6864 + ' WHEN indexes.[type] = 2 AND EXISTS(SELECT * FROM sys.index_columns index_columns INNER JOIN sys.columns columns ON index_columns.[object_id] = columns.[object_id] AND index_columns.column_id = columns.column_id INNER JOIN sys.types types ON columns.system_type_id = types.user_type_id OR (columns.user_type_id = types.user_type_id AND types.is_assembly_type = 1) WHERE index_columns.[object_id] = objects.object_id AND index_columns.index_id = indexes.index_id AND (types.[name] IN(''xml'') OR (types.[name] IN(''varchar'',''nvarchar'',''varbinary'') AND columns.max_length = -1) OR (types.is_assembly_type = 1 AND columns.max_length = -1))) THEN 1 ELSE 0 END AS IsNewLOB'
6865
6866 + ', CASE WHEN indexes.[type] = 1 AND EXISTS(SELECT * FROM sys.columns columns WHERE columns.[object_id] = objects.object_id AND columns.is_filestream = 1) THEN 1 ELSE 0 END AS IsFileStream'
6867
6868 + ', CASE WHEN EXISTS(SELECT * FROM sys.indexes indexes WHERE indexes.[object_id] = objects.object_id AND [type] IN(5,6)) THEN 1 ELSE 0 END AS IsColumnStore'
6869
6870 + ', CASE WHEN EXISTS(SELECT * FROM sys.index_columns index_columns INNER JOIN sys.columns columns ON index_columns.object_id = columns.object_id AND index_columns.column_id = columns.column_id WHERE (index_columns.key_ordinal > 0 OR index_columns.partition_ordinal > 0) AND columns.is_computed = 1 AND index_columns.object_id = indexes.object_id AND index_columns.index_id = indexes.index_id) THEN 1 ELSE 0 END AS IsComputed'
6871
6872 + ', CASE WHEN EXISTS(SELECT * FROM sys.index_columns index_columns INNER JOIN sys.columns columns ON index_columns.[object_id] = columns.[object_id] AND index_columns.column_id = columns.column_id INNER JOIN sys.types types ON columns.system_type_id = types.system_type_id WHERE index_columns.[object_id] = objects.object_id AND index_columns.index_id = indexes.index_id AND types.[name] = ''timestamp'') THEN 1 ELSE 0 END AS IsTimestamp'
6873
6874 + ', CASE WHEN EXISTS (SELECT * FROM sys.indexes indexes2 INNER JOIN sys.destination_data_spaces destination_data_spaces ON indexes.data_space_id = destination_data_spaces.partition_scheme_id INNER JOIN sys.filegroups filegroups ON destination_data_spaces.data_space_id = filegroups.data_space_id WHERE filegroups.is_read_only = 1 AND indexes2.[object_id] = indexes.[object_id] AND indexes2.[index_id] = indexes.index_id' + CASE WHEN @PartitionLevel = 'Y' THEN ' AND destination_data_spaces.destination_id = partitions.partition_number' ELSE '' END + ') THEN 1'
6875 + ' WHEN EXISTS (SELECT * FROM sys.indexes indexes2 INNER JOIN sys.filegroups filegroups ON indexes.data_space_id = filegroups.data_space_id WHERE filegroups.is_read_only = 1 AND indexes.[object_id] = indexes2.[object_id] AND indexes.[index_id] = indexes2.index_id) THEN 1'
6876 + ' WHEN indexes.[type] = 1 AND EXISTS (SELECT * FROM sys.tables tables INNER JOIN sys.filegroups filegroups ON tables.lob_data_space_id = filegroups.data_space_id WHERE filegroups.is_read_only = 1 AND tables.[object_id] = objects.[object_id]) THEN 1 ELSE 0 END AS OnReadOnlyFileGroup'
6877
6878 + ', ' + CASE WHEN @Version >= 14 THEN 'CASE WHEN EXISTS(SELECT * FROM sys.index_resumable_operations index_resumable_operations WHERE state_desc = ''PAUSED'' AND index_resumable_operations.object_id = indexes.object_id AND index_resumable_operations.index_id = indexes.index_id AND (index_resumable_operations.partition_number = partitions.partition_number OR index_resumable_operations.partition_number IS NULL)) THEN 1 ELSE 0 END' ELSE '0' END + ' AS ResumableIndexOperation'
6879
6880 + ', stats.stats_id AS StatisticsID'
6881 + ', stats.name AS StatisticsName'
6882 + ', stats.no_recompute AS NoRecompute'
6883 + ', ' + CASE WHEN @Version >= 12 THEN 'stats.is_incremental' ELSE '0' END + ' AS IsIncremental'
6884 + ', ' + CASE WHEN @PartitionLevel = 'Y' THEN 'partitions.partition_id AS PartitionID' WHEN @PartitionLevel = 'N' THEN 'NULL AS PartitionID' END
6885 + ', ' + CASE WHEN @PartitionLevel = 'Y' THEN 'partitions.partition_number AS PartitionNumber' WHEN @PartitionLevel = 'N' THEN 'NULL AS PartitionNumber' END
6886 + ', ' + CASE WHEN @PartitionLevel = 'Y' THEN 'IndexPartitions.partition_count AS PartitionCount' WHEN @PartitionLevel = 'N' THEN 'NULL AS PartitionCount' END
6887 + ', 0 AS [Order]'
6888 + ', 0 AS Selected'
6889 + ', 0 AS Completed'
6890 + ' FROM sys.indexes indexes'
6891 + ' INNER JOIN sys.objects objects ON indexes.[object_id] = objects.[object_id]'
6892 + ' INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id]'
6893 + ' LEFT OUTER JOIN sys.tables tables ON objects.[object_id] = tables.[object_id]'
6894 + ' LEFT OUTER JOIN sys.stats stats ON indexes.[object_id] = stats.[object_id] AND indexes.[index_id] = stats.[stats_id]'
6895 IF @PartitionLevel = 'Y'
6896 BEGIN
6897 SET @CurrentCommand01 = @CurrentCommand01 + ' LEFT OUTER JOIN sys.partitions partitions ON indexes.[object_id] = partitions.[object_id] AND indexes.index_id = partitions.index_id'
6898 + ' LEFT OUTER JOIN (SELECT partitions.[object_id], partitions.index_id, COUNT(DISTINCT partitions.partition_number) AS partition_count FROM sys.partitions partitions GROUP BY partitions.[object_id], partitions.index_id) IndexPartitions ON partitions.[object_id] = IndexPartitions.[object_id] AND partitions.[index_id] = IndexPartitions.[index_id]'
6899 END
6900
6901 SET @CurrentCommand01 = @CurrentCommand01 + ' WHERE objects.[type] IN(''U'',''V'')'
6902 + CASE WHEN @MSShippedObjects = 'N' THEN ' AND objects.is_ms_shipped = 0' ELSE '' END
6903 + ' AND indexes.[type] IN(1,2,3,4,5,6,7)'
6904 + ' AND indexes.is_disabled = 0 AND indexes.is_hypothetical = 0'
6905 END
6906
6907 IF (EXISTS(SELECT * FROM @ActionsPreferred) AND @UpdateStatistics = 'COLUMNS') OR @UpdateStatistics = 'ALL'
6908 BEGIN
6909 SET @CurrentCommand01 = @CurrentCommand01 + ' UNION '
6910 END
6911
6912 IF @UpdateStatistics IN('ALL','COLUMNS')
6913 BEGIN
6914 SET @CurrentCommand01 = @CurrentCommand01 + 'SELECT schemas.[schema_id] AS SchemaID'
6915 + ', schemas.[name] AS SchemaName'
6916 + ', objects.[object_id] AS ObjectID'
6917 + ', objects.[name] AS ObjectName'
6918 + ', RTRIM(objects.[type]) AS ObjectType'
6919 + ', ' + CASE WHEN @Version >= 12 THEN 'tables.is_memory_optimized' ELSE '0' END + ' AS IsMemoryOptimized'
6920 + ', NULL AS IndexID, NULL AS IndexName'
6921 + ', NULL AS IndexType'
6922 + ', NULL AS AllowPageLocks'
6923 + ', NULL AS IsImageText'
6924 + ', NULL AS IsNewLOB'
6925 + ', NULL AS IsFileStream'
6926 + ', NULL AS IsColumnStore'
6927 + ', NULL AS IsComputed'
6928 + ', NULL AS IsTimestamp'
6929 + ', NULL AS OnReadOnlyFileGroup'
6930 + ', NULL AS ResumableIndexOperation'
6931 + ', stats.stats_id AS StatisticsID'
6932 + ', stats.name AS StatisticsName'
6933 + ', stats.no_recompute AS NoRecompute'
6934 + ', ' + CASE WHEN @Version >= 12 THEN 'stats.is_incremental' ELSE '0' END + ' AS IsIncremental'
6935 + ', NULL AS PartitionID'
6936 + ', ' + CASE WHEN @PartitionLevelStatistics = 1 THEN 'dm_db_incremental_stats_properties.partition_number' ELSE 'NULL' END + ' AS PartitionNumber'
6937 + ', NULL AS PartitionCount'
6938 + ', 0 AS [Order]'
6939 + ', 0 AS Selected'
6940 + ', 0 AS Completed'
6941 + ' FROM sys.stats stats'
6942 + ' INNER JOIN sys.objects objects ON stats.[object_id] = objects.[object_id]'
6943 + ' INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id]'
6944 + ' LEFT OUTER JOIN sys.tables tables ON objects.[object_id] = tables.[object_id]'
6945
6946 IF @PartitionLevelStatistics = 1
6947 BEGIN
6948 SET @CurrentCommand01 = @CurrentCommand01 + ' OUTER APPLY sys.dm_db_incremental_stats_properties(stats.object_id, stats.stats_id) dm_db_incremental_stats_properties'
6949 END
6950
6951 SET @CurrentCommand01 = @CurrentCommand01 + ' WHERE objects.[type] IN(''U'',''V'')'
6952 + CASE WHEN @MSShippedObjects = 'N' THEN ' AND objects.is_ms_shipped = 0' ELSE '' END
6953 + ' AND NOT EXISTS(SELECT * FROM sys.indexes indexes WHERE indexes.[object_id] = stats.[object_id] AND indexes.index_id = stats.stats_id)'
6954 END
6955
6956 SET @CurrentCommand01 = @CurrentCommand01 + ') IndexesStatistics'
6957
6958 INSERT INTO @tmpIndexesStatistics (SchemaID, SchemaName, ObjectID, ObjectName, ObjectType, IsMemoryOptimized, IndexID, IndexName, IndexType, AllowPageLocks, IsImageText, IsNewLOB, IsFileStream, IsColumnStore, IsComputed, IsTimestamp, OnReadOnlyFileGroup, ResumableIndexOperation, StatisticsID, StatisticsName, [NoRecompute], IsIncremental, PartitionID, PartitionNumber, PartitionCount, [Order], Selected, Completed)
6959 EXECUTE sp_executesql @statement = @CurrentCommand01
6960 SET @Error = @@ERROR
6961 IF @Error <> 0
6962 BEGIN
6963 SET @ReturnCode = @Error
6964 END
6965 END
6966
6967 IF @Indexes IS NULL
6968 BEGIN
6969 UPDATE tmpIndexesStatistics
6970 SET tmpIndexesStatistics.Selected = 1
6971 FROM @tmpIndexesStatistics tmpIndexesStatistics
6972 END
6973 ELSE
6974 BEGIN
6975 UPDATE tmpIndexesStatistics
6976 SET tmpIndexesStatistics.Selected = SelectedIndexes.Selected
6977 FROM @tmpIndexesStatistics tmpIndexesStatistics
6978 INNER JOIN @SelectedIndexes SelectedIndexes
6979 ON @CurrentDatabaseName LIKE REPLACE(SelectedIndexes.DatabaseName,'_','[_]') AND tmpIndexesStatistics.SchemaName LIKE REPLACE(SelectedIndexes.SchemaName,'_','[_]') AND tmpIndexesStatistics.ObjectName LIKE REPLACE(SelectedIndexes.ObjectName,'_','[_]') AND COALESCE(tmpIndexesStatistics.IndexName,tmpIndexesStatistics.StatisticsName) LIKE REPLACE(SelectedIndexes.IndexName,'_','[_]')
6980 WHERE SelectedIndexes.Selected = 1
6981
6982 UPDATE tmpIndexesStatistics
6983 SET tmpIndexesStatistics.Selected = SelectedIndexes.Selected
6984 FROM @tmpIndexesStatistics tmpIndexesStatistics
6985 INNER JOIN @SelectedIndexes SelectedIndexes
6986 ON @CurrentDatabaseName LIKE REPLACE(SelectedIndexes.DatabaseName,'_','[_]') AND tmpIndexesStatistics.SchemaName LIKE REPLACE(SelectedIndexes.SchemaName,'_','[_]') AND tmpIndexesStatistics.ObjectName LIKE REPLACE(SelectedIndexes.ObjectName,'_','[_]') AND COALESCE(tmpIndexesStatistics.IndexName,tmpIndexesStatistics.StatisticsName) LIKE REPLACE(SelectedIndexes.IndexName,'_','[_]')
6987 WHERE SelectedIndexes.Selected = 0
6988
6989 UPDATE tmpIndexesStatistics
6990 SET tmpIndexesStatistics.StartPosition = SelectedIndexes2.StartPosition
6991 FROM @tmpIndexesStatistics tmpIndexesStatistics
6992 INNER JOIN (SELECT tmpIndexesStatistics.SchemaName, tmpIndexesStatistics.ObjectName, tmpIndexesStatistics.IndexName, tmpIndexesStatistics.StatisticsName, MIN(SelectedIndexes.StartPosition) AS StartPosition
6993 FROM @tmpIndexesStatistics tmpIndexesStatistics
6994 INNER JOIN @SelectedIndexes SelectedIndexes
6995 ON @CurrentDatabaseName LIKE REPLACE(SelectedIndexes.DatabaseName,'_','[_]') AND tmpIndexesStatistics.SchemaName LIKE REPLACE(SelectedIndexes.SchemaName,'_','[_]') AND tmpIndexesStatistics.ObjectName LIKE REPLACE(SelectedIndexes.ObjectName,'_','[_]') AND COALESCE(tmpIndexesStatistics.IndexName,tmpIndexesStatistics.StatisticsName) LIKE REPLACE(SelectedIndexes.IndexName,'_','[_]')
6996 WHERE SelectedIndexes.Selected = 1
6997 GROUP BY tmpIndexesStatistics.SchemaName, tmpIndexesStatistics.ObjectName, tmpIndexesStatistics.IndexName, tmpIndexesStatistics.StatisticsName) SelectedIndexes2
6998 ON tmpIndexesStatistics.SchemaName = SelectedIndexes2.SchemaName
6999 AND tmpIndexesStatistics.ObjectName = SelectedIndexes2.ObjectName
7000 AND (tmpIndexesStatistics.IndexName = SelectedIndexes2.IndexName OR tmpIndexesStatistics.IndexName IS NULL)
7001 AND (tmpIndexesStatistics.StatisticsName = SelectedIndexes2.StatisticsName OR tmpIndexesStatistics.StatisticsName IS NULL)
7002 END;
7003
7004 WITH tmpIndexesStatistics AS (
7005 SELECT SchemaName, ObjectName, [Order], ROW_NUMBER() OVER (ORDER BY ISNULL(ResumableIndexOperation,0) DESC, StartPosition ASC, SchemaName ASC, ObjectName ASC, CASE WHEN IndexType IS NULL THEN 1 ELSE 0 END ASC, IndexType ASC, IndexName ASC, StatisticsName ASC, PartitionNumber ASC) AS RowNumber
7006 FROM @tmpIndexesStatistics tmpIndexesStatistics
7007 WHERE Selected = 1
7008 )
7009 UPDATE tmpIndexesStatistics
7010 SET [Order] = RowNumber
7011
7012 SET @ErrorMessage = ''
7013 SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + '.' + QUOTENAME(SchemaName) + '.' + QUOTENAME(ObjectName) + ', '
7014 FROM @SelectedIndexes SelectedIndexes
7015 WHERE DatabaseName = @CurrentDatabaseName
7016 AND SchemaName NOT LIKE '%[%]%'
7017 AND ObjectName NOT LIKE '%[%]%'
7018 AND IndexName LIKE '%[%]%'
7019 AND NOT EXISTS (SELECT * FROM @tmpIndexesStatistics WHERE SchemaName = SelectedIndexes.SchemaName AND ObjectName = SelectedIndexes.ObjectName)
7020 IF @@ROWCOUNT > 0
7021 BEGIN
7022 SET @ErrorMessage = 'The following objects in the @Indexes parameter do not exist: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.'
7023 RAISERROR('%s',10,1,@ErrorMessage) WITH NOWAIT
7024 SET @Error = @@ERROR
7025 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
7026 END
7027
7028 SET @ErrorMessage = ''
7029 SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + QUOTENAME(SchemaName) + '.' + QUOTENAME(ObjectName) + '.' + QUOTENAME(IndexName) + ', '
7030 FROM @SelectedIndexes SelectedIndexes
7031 WHERE DatabaseName = @CurrentDatabaseName
7032 AND SchemaName NOT LIKE '%[%]%'
7033 AND ObjectName NOT LIKE '%[%]%'
7034 AND IndexName NOT LIKE '%[%]%'
7035 AND NOT EXISTS (SELECT * FROM @tmpIndexesStatistics WHERE SchemaName = SelectedIndexes.SchemaName AND ObjectName = SelectedIndexes.ObjectName AND IndexName = SelectedIndexes.IndexName)
7036 IF @@ROWCOUNT > 0
7037 BEGIN
7038 SET @ErrorMessage = 'The following indexes in the @Indexes parameter do not exist: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.'
7039 RAISERROR('%s',10,1,@ErrorMessage) WITH NOWAIT
7040 SET @Error = @@ERROR
7041 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
7042 END
7043
7044 WHILE (GETDATE() < DATEADD(ss,@TimeLimit,@StartTime) OR @TimeLimit IS NULL)
7045 BEGIN
7046 SELECT TOP 1 @CurrentIxID = ID,
7047 @CurrentIxOrder = [Order],
7048 @CurrentSchemaID = SchemaID,
7049 @CurrentSchemaName = SchemaName,
7050 @CurrentObjectID = ObjectID,
7051 @CurrentObjectName = ObjectName,
7052 @CurrentObjectType = ObjectType,
7053 @CurrentIsMemoryOptimized = IsMemoryOptimized,
7054 @CurrentIndexID = IndexID,
7055 @CurrentIndexName = IndexName,
7056 @CurrentIndexType = IndexType,
7057 @CurrentAllowPageLocks = AllowPageLocks,
7058 @CurrentIsImageText = IsImageText,
7059 @CurrentIsNewLOB = IsNewLOB,
7060 @CurrentIsFileStream = IsFileStream,
7061 @CurrentIsColumnStore = IsColumnStore,
7062 @CurrentIsComputed = IsComputed,
7063 @CurrentIsTimestamp = IsTimestamp,
7064 @CurrentOnReadOnlyFileGroup = OnReadOnlyFileGroup,
7065 @CurrentResumableIndexOperation = ResumableIndexOperation,
7066 @CurrentStatisticsID = StatisticsID,
7067 @CurrentStatisticsName = StatisticsName,
7068 @CurrentNoRecompute = [NoRecompute],
7069 @CurrentIsIncremental = IsIncremental,
7070 @CurrentPartitionID = PartitionID,
7071 @CurrentPartitionNumber = PartitionNumber,
7072 @CurrentPartitionCount = PartitionCount
7073 FROM @tmpIndexesStatistics
7074 WHERE Selected = 1
7075 AND Completed = 0
7076 ORDER BY [Order] ASC
7077
7078 IF @@ROWCOUNT = 0
7079 BEGIN
7080 BREAK
7081 END
7082
7083 -- Is the index a partition?
7084 IF @CurrentPartitionNumber IS NULL OR @CurrentPartitionCount = 1 BEGIN SET @CurrentIsPartition = 0 END ELSE BEGIN SET @CurrentIsPartition = 1 END
7085
7086 -- Does the index exist?
7087 IF @CurrentIndexID IS NOT NULL AND EXISTS(SELECT * FROM @ActionsPreferred)
7088 BEGIN
7089 SET @CurrentCommand02 = ''
7090
7091 IF @LockTimeout IS NOT NULL SET @CurrentCommand02 = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; '
7092 SET @CurrentCommand02 = @CurrentCommand02 + 'USE ' + QUOTENAME(@CurrentDatabaseName) + '; '
7093
7094 IF @CurrentIsPartition = 0 SET @CurrentCommand02 = @CurrentCommand02 + 'IF EXISTS(SELECT * FROM sys.indexes indexes INNER JOIN sys.objects objects ON indexes.[object_id] = objects.[object_id] INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] WHERE objects.[type] IN(''U'',''V'') AND indexes.[type] IN(1,2,3,4,5,6,7) AND indexes.is_disabled = 0 AND indexes.is_hypothetical = 0 AND schemas.[schema_id] = @ParamSchemaID AND schemas.[name] = @ParamSchemaName AND objects.[object_id] = @ParamObjectID AND objects.[name] = @ParamObjectName AND objects.[type] = @ParamObjectType AND indexes.index_id = @ParamIndexID AND indexes.[name] = @ParamIndexName AND indexes.[type] = @ParamIndexType) BEGIN SET @ParamIndexExists = 1 END'
7095 IF @CurrentIsPartition = 1 SET @CurrentCommand02 = @CurrentCommand02 + 'IF EXISTS(SELECT * FROM sys.indexes indexes INNER JOIN sys.objects objects ON indexes.[object_id] = objects.[object_id] INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] INNER JOIN sys.partitions partitions ON indexes.[object_id] = partitions.[object_id] AND indexes.index_id = partitions.index_id WHERE objects.[type] IN(''U'',''V'') AND indexes.[type] IN(1,2,3,4,5,6,7) AND indexes.is_disabled = 0 AND indexes.is_hypothetical = 0 AND schemas.[schema_id] = @ParamSchemaID AND schemas.[name] = @ParamSchemaName AND objects.[object_id] = @ParamObjectID AND objects.[name] = @ParamObjectName AND objects.[type] = @ParamObjectType AND indexes.index_id = @ParamIndexID AND indexes.[name] = @ParamIndexName AND indexes.[type] = @ParamIndexType AND partitions.partition_id = @ParamPartitionID AND partitions.partition_number = @ParamPartitionNumber) BEGIN SET @ParamIndexExists = 1 END'
7096
7097 BEGIN TRY
7098 EXECUTE sp_executesql @statement = @CurrentCommand02, @params = N'@ParamSchemaID int, @ParamSchemaName sysname, @ParamObjectID int, @ParamObjectName sysname, @ParamObjectType sysname, @ParamIndexID int, @ParamIndexName sysname, @ParamIndexType int, @ParamPartitionID bigint, @ParamPartitionNumber int, @ParamIndexExists bit OUTPUT', @ParamSchemaID = @CurrentSchemaID, @ParamSchemaName = @CurrentSchemaName, @ParamObjectID = @CurrentObjectID, @ParamObjectName = @CurrentObjectName, @ParamObjectType = @CurrentObjectType, @ParamIndexID = @CurrentIndexID, @ParamIndexName = @CurrentIndexName, @ParamIndexType = @CurrentIndexType, @ParamPartitionID = @CurrentPartitionID, @ParamPartitionNumber = @CurrentPartitionNumber, @ParamIndexExists = @CurrentIndexExists OUTPUT
7099
7100 IF @CurrentIndexExists IS NULL
7101 BEGIN
7102 SET @CurrentIndexExists = 0
7103 GOTO NoAction
7104 END
7105 END TRY
7106 BEGIN CATCH
7107 SET @ErrorMessage = 'Msg ' + CAST(ERROR_NUMBER() AS nvarchar) + ', ' + ISNULL(ERROR_MESSAGE(),'') + CASE WHEN ERROR_NUMBER() = 1222 THEN ' The index ' + QUOTENAME(@CurrentIndexName) + ' on the object ' + QUOTENAME(@CurrentDatabaseName) + '.' + QUOTENAME(@CurrentSchemaName) + '.' + QUOTENAME(@CurrentObjectName) + ' is locked. It could not be checked if the index exists.' ELSE '' END
7108 SET @Severity = CASE WHEN ERROR_NUMBER() IN(1205,1222) THEN @LockMessageSeverity ELSE 16 END
7109 RAISERROR('%s',@Severity,1,@ErrorMessage) WITH NOWAIT
7110 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
7111
7112 IF NOT (ERROR_NUMBER() IN(1205,1222) AND @LockMessageSeverity = 10)
7113 BEGIN
7114 SET @ReturnCode = ERROR_NUMBER()
7115 END
7116
7117 GOTO NoAction
7118 END CATCH
7119 END
7120
7121 -- Does the statistics exist?
7122 IF @CurrentStatisticsID IS NOT NULL AND @UpdateStatistics IS NOT NULL
7123 BEGIN
7124 SET @CurrentCommand03 = ''
7125
7126 IF @LockTimeout IS NOT NULL SET @CurrentCommand03 = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; '
7127 SET @CurrentCommand03 = @CurrentCommand03 + 'USE ' + QUOTENAME(@CurrentDatabaseName) + '; '
7128
7129 SET @CurrentCommand03 = @CurrentCommand03 + 'IF EXISTS(SELECT * FROM sys.stats stats INNER JOIN sys.objects objects ON stats.[object_id] = objects.[object_id] INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id] WHERE objects.[type] IN(''U'',''V'')' + CASE WHEN @MSShippedObjects = 'N' THEN ' AND objects.is_ms_shipped = 0' ELSE '' END + ' AND schemas.[schema_id] = @ParamSchemaID AND schemas.[name] = @ParamSchemaName AND objects.[object_id] = @ParamObjectID AND objects.[name] = @ParamObjectName AND objects.[type] = @ParamObjectType AND stats.stats_id = @ParamStatisticsID AND stats.[name] = @ParamStatisticsName) BEGIN SET @ParamStatisticsExists = 1 END'
7130
7131 BEGIN TRY
7132 EXECUTE sp_executesql @statement = @CurrentCommand03, @params = N'@ParamSchemaID int, @ParamSchemaName sysname, @ParamObjectID int, @ParamObjectName sysname, @ParamObjectType sysname, @ParamStatisticsID int, @ParamStatisticsName sysname, @ParamStatisticsExists bit OUTPUT', @ParamSchemaID = @CurrentSchemaID, @ParamSchemaName = @CurrentSchemaName, @ParamObjectID = @CurrentObjectID, @ParamObjectName = @CurrentObjectName, @ParamObjectType = @CurrentObjectType, @ParamStatisticsID = @CurrentStatisticsID, @ParamStatisticsName = @CurrentStatisticsName, @ParamStatisticsExists = @CurrentStatisticsExists OUTPUT
7133
7134 IF @CurrentStatisticsExists IS NULL
7135 BEGIN
7136 SET @CurrentStatisticsExists = 0
7137 GOTO NoAction
7138 END
7139 END TRY
7140 BEGIN CATCH
7141 SET @ErrorMessage = 'Msg ' + CAST(ERROR_NUMBER() AS nvarchar) + ', ' + ISNULL(ERROR_MESSAGE(),'') + CASE WHEN ERROR_NUMBER() = 1222 THEN ' The statistics ' + QUOTENAME(@CurrentStatisticsName) + ' on the object ' + QUOTENAME(@CurrentDatabaseName) + '.' + QUOTENAME(@CurrentSchemaName) + '.' + QUOTENAME(@CurrentObjectName) + ' is locked. It could not be checked if the statistics exists.' ELSE '' END
7142 SET @Severity = CASE WHEN ERROR_NUMBER() IN(1205,1222) THEN @LockMessageSeverity ELSE 16 END
7143 RAISERROR('%s',@Severity,1,@ErrorMessage) WITH NOWAIT
7144 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
7145
7146 IF NOT (ERROR_NUMBER() IN(1205,1222) AND @LockMessageSeverity = 10)
7147 BEGIN
7148 SET @ReturnCode = ERROR_NUMBER()
7149 END
7150
7151 GOTO NoAction
7152 END CATCH
7153 END
7154
7155 -- Has the data in the statistics been modified since the statistics was last updated?
7156 IF @CurrentStatisticsID IS NOT NULL AND @UpdateStatistics IS NOT NULL
7157 BEGIN
7158 SET @CurrentCommand04 = ''
7159
7160 IF @LockTimeout IS NOT NULL SET @CurrentCommand04 = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; '
7161 SET @CurrentCommand04 = @CurrentCommand04 + 'USE ' + QUOTENAME(@CurrentDatabaseName) + '; '
7162
7163 IF @PartitionLevelStatistics = 1 AND @CurrentIsIncremental = 1
7164 BEGIN
7165 SET @CurrentCommand04 = @CurrentCommand04 + 'SELECT @ParamRowCount = [rows], @ParamModificationCounter = modification_counter FROM sys.dm_db_incremental_stats_properties (@ParamObjectID, @ParamStatisticsID) WHERE partition_number = @ParamPartitionNumber'
7166 END
7167 ELSE
7168 IF (@Version >= 10.504000 AND @Version < 11) OR @Version >= 11.03000
7169 BEGIN
7170 SET @CurrentCommand04 = @CurrentCommand04 + 'SELECT @ParamRowCount = [rows], @ParamModificationCounter = modification_counter FROM sys.dm_db_stats_properties (@ParamObjectID, @ParamStatisticsID)'
7171 END
7172 ELSE
7173 BEGIN
7174 SET @CurrentCommand04 = @CurrentCommand04 + 'SELECT @ParamRowCount = rowcnt, @ParamModificationCounter = rowmodctr FROM sys.sysindexes sysindexes WHERE sysindexes.[id] = @ParamObjectID AND sysindexes.[indid] = @ParamStatisticsID'
7175 END
7176
7177 BEGIN TRY
7178 EXECUTE sp_executesql @statement = @CurrentCommand04, @params = N'@ParamObjectID int, @ParamStatisticsID int, @ParamPartitionNumber int, @ParamRowCount bigint OUTPUT, @ParamModificationCounter bigint OUTPUT', @ParamObjectID = @CurrentObjectID, @ParamStatisticsID = @CurrentStatisticsID, @ParamPartitionNumber = @CurrentPartitionNumber, @ParamRowCount = @CurrentRowCount OUTPUT, @ParamModificationCounter = @CurrentModificationCounter OUTPUT
7179
7180 IF @CurrentRowCount IS NULL SET @CurrentRowCount = 0
7181 IF @CurrentModificationCounter IS NULL SET @CurrentModificationCounter = 0
7182 END TRY
7183 BEGIN CATCH
7184 SET @ErrorMessage = 'Msg ' + CAST(ERROR_NUMBER() AS nvarchar) + ', ' + ISNULL(ERROR_MESSAGE(),'') + CASE WHEN ERROR_NUMBER() = 1222 THEN ' The statistics ' + QUOTENAME(@CurrentStatisticsName) + ' on the object ' + QUOTENAME(@CurrentDatabaseName) + '.' + QUOTENAME(@CurrentSchemaName) + '.' + QUOTENAME(@CurrentObjectName) + ' is locked. The rows and modification_counter could not be checked.' ELSE '' END
7185 SET @Severity = CASE WHEN ERROR_NUMBER() IN(1205,1222) THEN @LockMessageSeverity ELSE 16 END
7186 RAISERROR('%s',@Severity,1,@ErrorMessage) WITH NOWAIT
7187 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
7188
7189 IF NOT (ERROR_NUMBER() IN(1205,1222) AND @LockMessageSeverity = 10)
7190 BEGIN
7191 SET @ReturnCode = ERROR_NUMBER()
7192 END
7193
7194 GOTO NoAction
7195 END CATCH
7196 END
7197
7198 -- Is the index fragmented?
7199 IF @CurrentIndexID IS NOT NULL
7200 AND @CurrentOnReadOnlyFileGroup = 0
7201 AND EXISTS(SELECT * FROM @ActionsPreferred)
7202 AND (EXISTS(SELECT [Priority], [Action], COUNT(*) FROM @ActionsPreferred GROUP BY [Priority], [Action] HAVING COUNT(*) <> 3) OR @MinNumberOfPages > 0 OR @MaxNumberOfPages IS NOT NULL)
7203 BEGIN
7204 SET @CurrentCommand05 = ''
7205
7206 IF @LockTimeout IS NOT NULL SET @CurrentCommand05 = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; '
7207
7208 SET @CurrentCommand05 = @CurrentCommand05 + 'SELECT @ParamFragmentationLevel = MAX(avg_fragmentation_in_percent), @ParamPageCount = SUM(page_count) FROM sys.dm_db_index_physical_stats(@ParamDatabaseID, @ParamObjectID, @ParamIndexID, @ParamPartitionNumber, ''LIMITED'') WHERE alloc_unit_type_desc = ''IN_ROW_DATA'' AND index_level = 0'
7209
7210 BEGIN TRY
7211 EXECUTE sp_executesql @statement = @CurrentCommand05, @params = N'@ParamDatabaseID int, @ParamObjectID int, @ParamIndexID int, @ParamPartitionNumber int, @ParamFragmentationLevel float OUTPUT, @ParamPageCount bigint OUTPUT', @ParamDatabaseID = @CurrentDatabaseID, @ParamObjectID = @CurrentObjectID, @ParamIndexID = @CurrentIndexID, @ParamPartitionNumber = @CurrentPartitionNumber, @ParamFragmentationLevel = @CurrentFragmentationLevel OUTPUT, @ParamPageCount = @CurrentPageCount OUTPUT
7212 END TRY
7213 BEGIN CATCH
7214 SET @ErrorMessage = 'Msg ' + CAST(ERROR_NUMBER() AS nvarchar) + ', ' + ISNULL(ERROR_MESSAGE(),'') + CASE WHEN ERROR_NUMBER() = 1222 THEN ' The index ' + QUOTENAME(@CurrentIndexName) + ' on the object ' + QUOTENAME(@CurrentDatabaseName) + '.' + QUOTENAME(@CurrentSchemaName) + '.' + QUOTENAME(@CurrentObjectName) + ' is locked. The page_count and avg_fragmentation_in_percent could not be checked.' ELSE '' END
7215 SET @Severity = CASE WHEN ERROR_NUMBER() IN(1205,1222) THEN @LockMessageSeverity ELSE 16 END
7216 RAISERROR('%s',@Severity,1,@ErrorMessage) WITH NOWAIT
7217 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
7218
7219 IF NOT (ERROR_NUMBER() IN(1205,1222) AND @LockMessageSeverity = 10)
7220 BEGIN
7221 SET @ReturnCode = ERROR_NUMBER()
7222 END
7223
7224 GOTO NoAction
7225 END CATCH
7226 END
7227
7228 -- Select fragmentation group
7229 IF @CurrentIndexID IS NOT NULL AND @CurrentOnReadOnlyFileGroup = 0 AND EXISTS(SELECT * FROM @ActionsPreferred)
7230 BEGIN
7231 SET @CurrentFragmentationGroup = CASE
7232 WHEN @CurrentFragmentationLevel >= @FragmentationLevel2 THEN 'High'
7233 WHEN @CurrentFragmentationLevel >= @FragmentationLevel1 AND @CurrentFragmentationLevel < @FragmentationLevel2 THEN 'Medium'
7234 WHEN @CurrentFragmentationLevel < @FragmentationLevel1 THEN 'Low'
7235 END
7236 END
7237
7238 -- Which actions are allowed?
7239 IF @CurrentIndexID IS NOT NULL AND EXISTS(SELECT * FROM @ActionsPreferred)
7240 BEGIN
7241 IF @CurrentOnReadOnlyFileGroup = 0 AND @CurrentIndexType IN (1,2,3,4,5) AND (@CurrentIsMemoryOptimized = 0 OR @CurrentIsMemoryOptimized IS NULL) AND (@CurrentAllowPageLocks = 1 OR @CurrentIndexType = 5)
7242 BEGIN
7243 INSERT INTO @CurrentActionsAllowed ([Action])
7244 VALUES ('INDEX_REORGANIZE')
7245 END
7246 IF @CurrentOnReadOnlyFileGroup = 0 AND @CurrentIndexType IN (1,2,3,4,5) AND (@CurrentIsMemoryOptimized = 0 OR @CurrentIsMemoryOptimized IS NULL)
7247 BEGIN
7248 INSERT INTO @CurrentActionsAllowed ([Action])
7249 VALUES ('INDEX_REBUILD_OFFLINE')
7250 END
7251 IF @CurrentOnReadOnlyFileGroup = 0
7252 AND (@CurrentIsMemoryOptimized = 0 OR @CurrentIsMemoryOptimized IS NULL)
7253 AND (@CurrentIsPartition = 0 OR @Version >= 12)
7254 AND ((@CurrentIndexType = 1 AND @CurrentIsImageText = 0 AND @CurrentIsNewLOB = 0)
7255 OR (@CurrentIndexType = 2 AND @CurrentIsNewLOB = 0)
7256 OR (@CurrentIndexType = 1 AND @CurrentIsImageText = 0 AND @CurrentIsFileStream = 0 AND @Version >= 11)
7257 OR (@CurrentIndexType = 2 AND @Version >= 11))
7258 AND (@CurrentIsColumnStore = 0 OR @Version < 11)
7259 AND SERVERPROPERTY('EngineEdition') IN (3,5,8)
7260 BEGIN
7261 INSERT INTO @CurrentActionsAllowed ([Action])
7262 VALUES ('INDEX_REBUILD_ONLINE')
7263 END
7264 END
7265
7266 -- Decide action
7267 IF @CurrentIndexID IS NOT NULL
7268 AND EXISTS(SELECT * FROM @ActionsPreferred)
7269 AND (@CurrentPageCount >= @MinNumberOfPages OR @MinNumberOfPages = 0)
7270 AND (@CurrentPageCount <= @MaxNumberOfPages OR @MaxNumberOfPages IS NULL)
7271 AND @CurrentResumableIndexOperation = 0
7272 BEGIN
7273 IF EXISTS(SELECT [Priority], [Action], COUNT(*) FROM @ActionsPreferred GROUP BY [Priority], [Action] HAVING COUNT(*) <> 3)
7274 BEGIN
7275 SELECT @CurrentAction = [Action]
7276 FROM @ActionsPreferred
7277 WHERE FragmentationGroup = @CurrentFragmentationGroup
7278 AND [Priority] = (SELECT MIN([Priority])
7279 FROM @ActionsPreferred
7280 WHERE FragmentationGroup = @CurrentFragmentationGroup
7281 AND [Action] IN (SELECT [Action] FROM @CurrentActionsAllowed))
7282 END
7283 ELSE
7284 BEGIN
7285 SELECT @CurrentAction = [Action]
7286 FROM @ActionsPreferred
7287 WHERE [Priority] = (SELECT MIN([Priority])
7288 FROM @ActionsPreferred
7289 WHERE [Action] IN (SELECT [Action] FROM @CurrentActionsAllowed))
7290 END
7291 END
7292
7293 IF @CurrentResumableIndexOperation = 1
7294 BEGIN
7295 SET @CurrentAction = 'INDEX_REBUILD_ONLINE'
7296 END
7297
7298 -- Workaround for limitation in SQL Server, http://support.microsoft.com/kb/2292737
7299 IF @CurrentIndexID IS NOT NULL
7300 BEGIN
7301 SET @CurrentMaxDOP = @MaxDOP
7302
7303 IF @CurrentAction = 'INDEX_REBUILD_ONLINE' AND @CurrentAllowPageLocks = 0
7304 BEGIN
7305 SET @CurrentMaxDOP = 1
7306 END
7307 END
7308
7309 -- Update statistics?
7310 IF @CurrentStatisticsID IS NOT NULL
7311 AND ((@UpdateStatistics = 'ALL' AND (@CurrentIndexType IN (1,2,3,4,7) OR @CurrentIndexID IS NULL)) OR (@UpdateStatistics = 'INDEX' AND @CurrentIndexID IS NOT NULL AND @CurrentIndexType IN (1,2,3,4,7)) OR (@UpdateStatistics = 'COLUMNS' AND @CurrentIndexID IS NULL))
7312 AND ((@OnlyModifiedStatistics = 'N' AND @StatisticsModificationLevel IS NULL) OR (@OnlyModifiedStatistics = 'Y' AND @CurrentModificationCounter > 0) OR ((@CurrentModificationCounter * 1. / NULLIF(@CurrentRowCount,0)) * 100 >= @StatisticsModificationLevel) OR (@StatisticsModificationLevel IS NOT NULL AND @CurrentModificationCounter > 0 AND (@CurrentModificationCounter >= SQRT(@CurrentRowCount * 1000))) OR (@CurrentIsMemoryOptimized = 1 AND NOT (@Version >= 13 OR SERVERPROPERTY('EngineEdition') IN (5,8))))
7313 AND ((@CurrentIsPartition = 0 AND (@CurrentAction NOT IN('INDEX_REBUILD_ONLINE','INDEX_REBUILD_OFFLINE') OR @CurrentAction IS NULL)) OR (@CurrentIsPartition = 1 AND (@CurrentPartitionNumber = @CurrentPartitionCount OR (@PartitionLevelStatistics = 1 AND @CurrentIsIncremental = 1))))
7314 BEGIN
7315 SET @CurrentUpdateStatistics = 'Y'
7316 END
7317 ELSE
7318 BEGIN
7319 SET @CurrentUpdateStatistics = 'N'
7320 END
7321
7322 SET @CurrentStatisticsSample = @StatisticsSample
7323 SET @CurrentStatisticsResample = @StatisticsResample
7324
7325 -- Memory-optimized tables only supports FULLSCAN and RESAMPLE in SQL Server 2014
7326 IF @CurrentIsMemoryOptimized = 1 AND NOT (@Version >= 13 OR SERVERPROPERTY('EngineEdition') IN (5,8)) AND (@CurrentStatisticsSample <> 100 OR @CurrentStatisticsSample IS NULL)
7327 BEGIN
7328 SET @CurrentStatisticsSample = NULL
7329 SET @CurrentStatisticsResample = 'Y'
7330 END
7331
7332 -- Incremental statistics only supports RESAMPLE
7333 IF @PartitionLevelStatistics = 1 AND @CurrentIsIncremental = 1
7334 BEGIN
7335 SET @CurrentStatisticsSample = NULL
7336 SET @CurrentStatisticsResample = 'Y'
7337 END
7338
7339 -- Create index comment
7340 IF @CurrentIndexID IS NOT NULL
7341 BEGIN
7342 SET @CurrentComment06 = 'ObjectType: ' + CASE WHEN @CurrentObjectType = 'U' THEN 'Table' WHEN @CurrentObjectType = 'V' THEN 'View' ELSE 'N/A' END + ', '
7343 SET @CurrentComment06 = @CurrentComment06 + 'IndexType: ' + CASE WHEN @CurrentIndexType = 1 THEN 'Clustered' WHEN @CurrentIndexType = 2 THEN 'NonClustered' WHEN @CurrentIndexType = 3 THEN 'XML' WHEN @CurrentIndexType = 4 THEN 'Spatial' WHEN @CurrentIndexType = 5 THEN 'Clustered Columnstore' WHEN @CurrentIndexType = 6 THEN 'NonClustered Columnstore' WHEN @CurrentIndexType = 7 THEN 'NonClustered Hash' ELSE 'N/A' END + ', '
7344 SET @CurrentComment06 = @CurrentComment06 + 'ImageText: ' + CASE WHEN @CurrentIsImageText = 1 THEN 'Yes' WHEN @CurrentIsImageText = 0 THEN 'No' ELSE 'N/A' END + ', '
7345 SET @CurrentComment06 = @CurrentComment06 + 'NewLOB: ' + CASE WHEN @CurrentIsNewLOB = 1 THEN 'Yes' WHEN @CurrentIsNewLOB = 0 THEN 'No' ELSE 'N/A' END + ', '
7346 SET @CurrentComment06 = @CurrentComment06 + 'FileStream: ' + CASE WHEN @CurrentIsFileStream = 1 THEN 'Yes' WHEN @CurrentIsFileStream = 0 THEN 'No' ELSE 'N/A' END + ', '
7347 IF @Version >= 11 SET @CurrentComment06 = @CurrentComment06 + 'ColumnStore: ' + CASE WHEN @CurrentIsColumnStore = 1 THEN 'Yes' WHEN @CurrentIsColumnStore = 0 THEN 'No' ELSE 'N/A' END + ', '
7348 IF @Version >= 14 AND @Resumable = 'Y' SET @CurrentComment06 = @CurrentComment06 + 'Computed: ' + CASE WHEN @CurrentIsComputed = 1 THEN 'Yes' WHEN @CurrentIsComputed = 0 THEN 'No' ELSE 'N/A' END + ', '
7349 IF @Version >= 14 AND @Resumable = 'Y' SET @CurrentComment06 = @CurrentComment06 + 'Timestamp: ' + CASE WHEN @CurrentIsTimestamp = 1 THEN 'Yes' WHEN @CurrentIsTimestamp = 0 THEN 'No' ELSE 'N/A' END + ', '
7350 SET @CurrentComment06 = @CurrentComment06 + 'AllowPageLocks: ' + CASE WHEN @CurrentAllowPageLocks = 1 THEN 'Yes' WHEN @CurrentAllowPageLocks = 0 THEN 'No' ELSE 'N/A' END + ', '
7351 SET @CurrentComment06 = @CurrentComment06 + 'PageCount: ' + ISNULL(CAST(@CurrentPageCount AS nvarchar),'N/A') + ', '
7352 SET @CurrentComment06 = @CurrentComment06 + 'Fragmentation: ' + ISNULL(CAST(@CurrentFragmentationLevel AS nvarchar),'N/A')
7353 END
7354
7355 IF @CurrentIndexID IS NOT NULL AND (@CurrentPageCount IS NOT NULL OR @CurrentFragmentationLevel IS NOT NULL)
7356 BEGIN
7357 SET @CurrentExtendedInfo06 = (SELECT *
7358 FROM (SELECT CAST(@CurrentPageCount AS nvarchar) AS [PageCount],
7359 CAST(@CurrentFragmentationLevel AS nvarchar) AS Fragmentation
7360 ) ExtendedInfo FOR XML RAW('ExtendedInfo'), ELEMENTS)
7361 END
7362
7363 -- Create statistics comment
7364 IF @CurrentStatisticsID IS NOT NULL
7365 BEGIN
7366 SET @CurrentComment07 = 'ObjectType: ' + CASE WHEN @CurrentObjectType = 'U' THEN 'Table' WHEN @CurrentObjectType = 'V' THEN 'View' ELSE 'N/A' END + ', '
7367 SET @CurrentComment07 = @CurrentComment07 + 'IndexType: ' + CASE WHEN @CurrentIndexID IS NOT NULL THEN 'Index' ELSE 'Column' END + ', '
7368 IF @CurrentIndexID IS NOT NULL SET @CurrentComment07 = @CurrentComment07 + 'IndexType: ' + CASE WHEN @CurrentIndexType = 1 THEN 'Clustered' WHEN @CurrentIndexType = 2 THEN 'NonClustered' WHEN @CurrentIndexType = 3 THEN 'XML' WHEN @CurrentIndexType = 4 THEN 'Spatial' WHEN @CurrentIndexType = 5 THEN 'Clustered Columnstore' WHEN @CurrentIndexType = 6 THEN 'NonClustered Columnstore' WHEN @CurrentIndexType = 7 THEN 'NonClustered Hash' ELSE 'N/A' END + ', '
7369 SET @CurrentComment07 = @CurrentComment07 + 'Incremental: ' + CASE WHEN @CurrentIsIncremental = 1 THEN 'Y' WHEN @CurrentIsIncremental = 0 THEN 'N' ELSE 'N/A' END + ', '
7370 SET @CurrentComment07 = @CurrentComment07 + 'RowCount: ' + ISNULL(CAST(@CurrentRowCount AS nvarchar),'N/A') + ', '
7371 SET @CurrentComment07 = @CurrentComment07 + 'ModificationCounter: ' + ISNULL(CAST(@CurrentModificationCounter AS nvarchar),'N/A')
7372 END
7373
7374 IF @CurrentStatisticsID IS NOT NULL AND (@CurrentRowCount IS NOT NULL OR @CurrentModificationCounter IS NOT NULL)
7375 BEGIN
7376 SET @CurrentExtendedInfo07 = (SELECT *
7377 FROM (SELECT CAST(@CurrentRowCount AS nvarchar) AS [RowCount],
7378 CAST(@CurrentModificationCounter AS nvarchar) AS ModificationCounter
7379 ) ExtendedInfo FOR XML RAW('ExtendedInfo'), ELEMENTS)
7380 END
7381
7382 IF @CurrentIndexID IS NOT NULL AND @CurrentAction IS NOT NULL AND (GETDATE() < DATEADD(ss,@TimeLimit,@StartTime) OR @TimeLimit IS NULL)
7383 BEGIN
7384 SET @CurrentCommandType06 = 'ALTER_INDEX'
7385
7386 SET @CurrentCommand06 = ''
7387 IF @LockTimeout IS NOT NULL SET @CurrentCommand06 = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; '
7388 SET @CurrentCommand06 = @CurrentCommand06 + 'ALTER INDEX ' + QUOTENAME(@CurrentIndexName) + ' ON ' + QUOTENAME(@CurrentDatabaseName) + '.' + QUOTENAME(@CurrentSchemaName) + '.' + QUOTENAME(@CurrentObjectName)
7389 IF @CurrentResumableIndexOperation = 1 SET @CurrentCommand06 = @CurrentCommand06 + ' RESUME'
7390 IF @CurrentAction IN('INDEX_REBUILD_ONLINE','INDEX_REBUILD_OFFLINE') AND @CurrentResumableIndexOperation = 0 SET @CurrentCommand06 = @CurrentCommand06 + ' REBUILD'
7391 IF @CurrentAction IN('INDEX_REORGANIZE') AND @CurrentResumableIndexOperation = 0 SET @CurrentCommand06 = @CurrentCommand06 + ' REORGANIZE'
7392 IF @CurrentIsPartition = 1 AND @CurrentResumableIndexOperation = 0 SET @CurrentCommand06 = @CurrentCommand06 + ' PARTITION = ' + CAST(@CurrentPartitionNumber AS nvarchar)
7393
7394 IF @CurrentAction IN('INDEX_REBUILD_ONLINE','INDEX_REBUILD_OFFLINE') AND @SortInTempdb = 'Y' AND @CurrentIndexType IN(1,2,3,4) AND @CurrentResumableIndexOperation = 0
7395 BEGIN
7396 INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument)
7397 SELECT 'SORT_IN_TEMPDB = ON'
7398 END
7399
7400 IF @CurrentAction IN('INDEX_REBUILD_ONLINE','INDEX_REBUILD_OFFLINE') AND @SortInTempdb = 'N' AND @CurrentIndexType IN(1,2,3,4) AND @CurrentResumableIndexOperation = 0
7401 BEGIN
7402 INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument)
7403 SELECT 'SORT_IN_TEMPDB = OFF'
7404 END
7405
7406 IF @CurrentAction = 'INDEX_REBUILD_ONLINE' AND (@CurrentIsPartition = 0 OR @Version >= 12) AND @CurrentResumableIndexOperation = 0
7407 BEGIN
7408 INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument)
7409 SELECT 'ONLINE = ON' + CASE WHEN @WaitAtLowPriorityMaxDuration IS NOT NULL THEN ' (WAIT_AT_LOW_PRIORITY (MAX_DURATION = ' + CAST(@WaitAtLowPriorityMaxDuration AS nvarchar) + ', ABORT_AFTER_WAIT = ' + UPPER(@WaitAtLowPriorityAbortAfterWait) + '))' ELSE '' END
7410 END
7411
7412 IF @CurrentAction = 'INDEX_REBUILD_OFFLINE' AND (@CurrentIsPartition = 0 OR @Version >= 12) AND @CurrentResumableIndexOperation = 0
7413 BEGIN
7414 INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument)
7415 SELECT 'ONLINE = OFF'
7416 END
7417
7418 IF @CurrentAction IN('INDEX_REBUILD_ONLINE','INDEX_REBUILD_OFFLINE') AND @CurrentMaxDOP IS NOT NULL
7419 BEGIN
7420 INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument)
7421 SELECT 'MAXDOP = ' + CAST(@CurrentMaxDOP AS nvarchar)
7422 END
7423
7424 IF @CurrentAction IN('INDEX_REBUILD_ONLINE','INDEX_REBUILD_OFFLINE') AND @FillFactor IS NOT NULL AND @CurrentIsPartition = 0 AND @CurrentIndexType IN(1,2,3,4) AND @CurrentResumableIndexOperation = 0
7425 BEGIN
7426 INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument)
7427 SELECT 'FILLFACTOR = ' + CAST(@FillFactor AS nvarchar)
7428 END
7429
7430 IF @CurrentAction IN('INDEX_REBUILD_ONLINE','INDEX_REBUILD_OFFLINE') AND @PadIndex = 'Y' AND @CurrentIsPartition = 0 AND @CurrentIndexType IN(1,2,3,4) AND @CurrentResumableIndexOperation = 0
7431 BEGIN
7432 INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument)
7433 SELECT 'PAD_INDEX = ON'
7434 END
7435
7436 IF (@Version >= 14 OR SERVERPROPERTY('EngineEdition') IN (5,8)) AND @CurrentAction = 'INDEX_REBUILD_ONLINE' AND @CurrentResumableIndexOperation = 0
7437 BEGIN
7438 INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument)
7439 SELECT CASE WHEN @Resumable = 'Y' AND @CurrentIndexType IN(1,2) AND @CurrentIsComputed = 0 AND @CurrentIsTimestamp = 0 THEN 'RESUMABLE = ON' ELSE 'RESUMABLE = OFF' END
7440 END
7441
7442 IF (@Version >= 14 OR SERVERPROPERTY('EngineEdition') IN (5,8)) AND @CurrentAction = 'INDEX_REBUILD_ONLINE' AND @CurrentResumableIndexOperation = 0 AND @Resumable = 'Y' AND @CurrentIndexType IN(1,2) AND @CurrentIsComputed = 0 AND @CurrentIsTimestamp = 0 AND @TimeLimit IS NOT NULL
7443 BEGIN
7444 INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument)
7445 SELECT 'MAX_DURATION = ' + CAST(DATEDIFF(MINUTE,GETDATE(),DATEADD(ss,@TimeLimit,@StartTime)) AS nvarchar(max))
7446 END
7447
7448 IF @CurrentAction IN('INDEX_REORGANIZE') AND @LOBCompaction = 'Y'
7449 BEGIN
7450 INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument)
7451 SELECT 'LOB_COMPACTION = ON'
7452 END
7453
7454 IF @CurrentAction IN('INDEX_REORGANIZE') AND @LOBCompaction = 'N'
7455 BEGIN
7456 INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument)
7457 SELECT 'LOB_COMPACTION = OFF'
7458 END
7459
7460 IF EXISTS (SELECT * FROM @CurrentAlterIndexWithClauseArguments)
7461 BEGIN
7462 SET @CurrentAlterIndexWithClause = ' WITH ('
7463
7464 WHILE (1 = 1)
7465 BEGIN
7466 SELECT TOP 1 @CurrentAlterIndexArgumentID = ID,
7467 @CurrentAlterIndexArgument = Argument
7468 FROM @CurrentAlterIndexWithClauseArguments
7469 WHERE Added = 0
7470 ORDER BY ID ASC
7471
7472 IF @@ROWCOUNT = 0
7473 BEGIN
7474 BREAK
7475 END
7476
7477 SET @CurrentAlterIndexWithClause = @CurrentAlterIndexWithClause + @CurrentAlterIndexArgument + ', '
7478
7479 UPDATE @CurrentAlterIndexWithClauseArguments
7480 SET Added = 1
7481 WHERE [ID] = @CurrentAlterIndexArgumentID
7482 END
7483
7484 SET @CurrentAlterIndexWithClause = RTRIM(@CurrentAlterIndexWithClause)
7485
7486 SET @CurrentAlterIndexWithClause = LEFT(@CurrentAlterIndexWithClause,LEN(@CurrentAlterIndexWithClause) - 1)
7487
7488 SET @CurrentAlterIndexWithClause = @CurrentAlterIndexWithClause + ')'
7489 END
7490
7491 IF @CurrentAlterIndexWithClause IS NOT NULL SET @CurrentCommand06 = @CurrentCommand06 + @CurrentAlterIndexWithClause
7492
7493 EXECUTE @CurrentCommandOutput06 = [dbo].[CommandExecute] @Command = @CurrentCommand06, @CommandType = @CurrentCommandType06, @Mode = 2, @Comment = @CurrentComment06, @DatabaseName = @CurrentDatabaseName, @SchemaName = @CurrentSchemaName, @ObjectName = @CurrentObjectName, @ObjectType = @CurrentObjectType, @IndexName = @CurrentIndexName, @IndexType = @CurrentIndexType, @PartitionNumber = @CurrentPartitionNumber, @ExtendedInfo = @CurrentExtendedInfo06, @LockMessageSeverity = @LockMessageSeverity, @LogToTable = @LogToTable, @Execute = @Execute
7494 SET @Error = @@ERROR
7495 IF @Error <> 0 SET @CurrentCommandOutput06 = @Error
7496 IF @CurrentCommandOutput06 <> 0 SET @ReturnCode = @CurrentCommandOutput06
7497
7498 IF @Delay > 0
7499 BEGIN
7500 SET @CurrentDelay = DATEADD(ss,@Delay,'1900-01-01')
7501 WAITFOR DELAY @CurrentDelay
7502 END
7503 END
7504
7505 SET @CurrentMaxDOP = @MaxDOP
7506
7507 IF @CurrentStatisticsID IS NOT NULL AND @CurrentUpdateStatistics = 'Y' AND (GETDATE() < DATEADD(ss,@TimeLimit,@StartTime) OR @TimeLimit IS NULL)
7508 BEGIN
7509 SET @CurrentCommandType07 = 'UPDATE_STATISTICS'
7510
7511 SET @CurrentCommand07 = ''
7512 IF @LockTimeout IS NOT NULL SET @CurrentCommand07 = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; '
7513 SET @CurrentCommand07 = @CurrentCommand07 + 'UPDATE STATISTICS ' + QUOTENAME(@CurrentDatabaseName) + '.' + QUOTENAME(@CurrentSchemaName) + '.' + QUOTENAME(@CurrentObjectName) + ' ' + QUOTENAME(@CurrentStatisticsName)
7514
7515 IF @CurrentMaxDOP IS NOT NULL AND ((@Version >= 12.06024 AND @Version < 13) OR (@Version >= 13.05026 AND @Version < 14) OR @Version >= 14.030154)
7516 BEGIN
7517 INSERT INTO @CurrentUpdateStatisticsWithClauseArguments (Argument)
7518 SELECT 'MAXDOP = ' + CAST(@CurrentMaxDOP AS nvarchar)
7519 END
7520
7521 IF @CurrentStatisticsSample = 100
7522 BEGIN
7523 INSERT INTO @CurrentUpdateStatisticsWithClauseArguments (Argument)
7524 SELECT 'FULLSCAN'
7525 END
7526
7527 IF @CurrentStatisticsSample IS NOT NULL AND @CurrentStatisticsSample <> 100
7528 BEGIN
7529 INSERT INTO @CurrentUpdateStatisticsWithClauseArguments (Argument)
7530 SELECT 'SAMPLE ' + CAST(@CurrentStatisticsSample AS nvarchar) + ' PERCENT'
7531 END
7532
7533 IF @CurrentStatisticsResample = 'Y'
7534 BEGIN
7535 INSERT INTO @CurrentUpdateStatisticsWithClauseArguments (Argument)
7536 SELECT 'RESAMPLE'
7537 END
7538
7539 IF @CurrentNoRecompute = 1
7540 BEGIN
7541 INSERT INTO @CurrentUpdateStatisticsWithClauseArguments (Argument)
7542 SELECT 'NORECOMPUTE'
7543 END
7544
7545 IF EXISTS (SELECT * FROM @CurrentUpdateStatisticsWithClauseArguments)
7546 BEGIN
7547 SET @CurrentUpdateStatisticsWithClause = ' WITH'
7548
7549 WHILE (1 = 1)
7550 BEGIN
7551 SELECT TOP 1 @CurrentUpdateStatisticsArgumentID = ID,
7552 @CurrentUpdateStatisticsArgument = Argument
7553 FROM @CurrentUpdateStatisticsWithClauseArguments
7554 WHERE Added = 0
7555 ORDER BY ID ASC
7556
7557 IF @@ROWCOUNT = 0
7558 BEGIN
7559 BREAK
7560 END
7561
7562 SET @CurrentUpdateStatisticsWithClause = @CurrentUpdateStatisticsWithClause + ' ' + @CurrentUpdateStatisticsArgument + ','
7563
7564 UPDATE @CurrentUpdateStatisticsWithClauseArguments
7565 SET Added = 1
7566 WHERE [ID] = @CurrentUpdateStatisticsArgumentID
7567 END
7568
7569 SET @CurrentUpdateStatisticsWithClause = LEFT(@CurrentUpdateStatisticsWithClause,LEN(@CurrentUpdateStatisticsWithClause) - 1)
7570 END
7571
7572 IF @CurrentUpdateStatisticsWithClause IS NOT NULL SET @CurrentCommand07 = @CurrentCommand07 + @CurrentUpdateStatisticsWithClause
7573
7574 IF @PartitionLevelStatistics = 1 AND @CurrentIsIncremental = 1 AND @CurrentPartitionNumber IS NOT NULL SET @CurrentCommand07 = @CurrentCommand07 + ' ON PARTITIONS(' + CAST(@CurrentPartitionNumber AS nvarchar(max)) + ')'
7575
7576 EXECUTE @CurrentCommandOutput07 = [dbo].[CommandExecute] @Command = @CurrentCommand07, @CommandType = @CurrentCommandType07, @Mode = 2, @Comment = @CurrentComment07, @DatabaseName = @CurrentDatabaseName, @SchemaName = @CurrentSchemaName, @ObjectName = @CurrentObjectName, @ObjectType = @CurrentObjectType, @IndexName = @CurrentIndexName, @IndexType = @CurrentIndexType, @StatisticsName = @CurrentStatisticsName, @ExtendedInfo = @CurrentExtendedInfo07, @LockMessageSeverity = @LockMessageSeverity, @LogToTable = @LogToTable, @Execute = @Execute
7577 SET @Error = @@ERROR
7578 IF @Error <> 0 SET @CurrentCommandOutput07 = @Error
7579 IF @CurrentCommandOutput07 <> 0 SET @ReturnCode = @CurrentCommandOutput07
7580 END
7581
7582 NoAction:
7583
7584 -- Update that the index or statistics is completed
7585 UPDATE @tmpIndexesStatistics
7586 SET Completed = 1
7587 WHERE Selected = 1
7588 AND Completed = 0
7589 AND [Order] = @CurrentIxOrder
7590 AND ID = @CurrentIxID
7591
7592 -- Clear variables
7593 SET @CurrentCommand02 = NULL
7594 SET @CurrentCommand03 = NULL
7595 SET @CurrentCommand04 = NULL
7596 SET @CurrentCommand05 = NULL
7597 SET @CurrentCommand06 = NULL
7598 SET @CurrentCommand07 = NULL
7599
7600 SET @CurrentCommandOutput06 = NULL
7601 SET @CurrentCommandOutput07 = NULL
7602
7603 SET @CurrentCommandType06 = NULL
7604 SET @CurrentCommandType07 = NULL
7605
7606 SET @CurrentComment06 = NULL
7607 SET @CurrentComment07 = NULL
7608
7609 SET @CurrentExtendedInfo06 = NULL
7610 SET @CurrentExtendedInfo07 = NULL
7611
7612 SET @CurrentIxID = NULL
7613 SET @CurrentIxOrder = NULL
7614 SET @CurrentSchemaID = NULL
7615 SET @CurrentSchemaName = NULL
7616 SET @CurrentObjectID = NULL
7617 SET @CurrentObjectName = NULL
7618 SET @CurrentObjectType = NULL
7619 SET @CurrentIsMemoryOptimized = NULL
7620 SET @CurrentIndexID = NULL
7621 SET @CurrentIndexName = NULL
7622 SET @CurrentIndexType = NULL
7623 SET @CurrentStatisticsID = NULL
7624 SET @CurrentStatisticsName = NULL
7625 SET @CurrentPartitionID = NULL
7626 SET @CurrentPartitionNumber = NULL
7627 SET @CurrentPartitionCount = NULL
7628 SET @CurrentIsPartition = NULL
7629 SET @CurrentIndexExists = NULL
7630 SET @CurrentStatisticsExists = NULL
7631 SET @CurrentIsImageText = NULL
7632 SET @CurrentIsNewLOB = NULL
7633 SET @CurrentIsFileStream = NULL
7634 SET @CurrentIsColumnStore = NULL
7635 SET @CurrentIsComputed = NULL
7636 SET @CurrentIsTimestamp = NULL
7637 SET @CurrentAllowPageLocks = NULL
7638 SET @CurrentNoRecompute = NULL
7639 SET @CurrentIsIncremental = NULL
7640 SET @CurrentRowCount = NULL
7641 SET @CurrentModificationCounter = NULL
7642 SET @CurrentOnReadOnlyFileGroup = NULL
7643 SET @CurrentResumableIndexOperation = NULL
7644 SET @CurrentFragmentationLevel = NULL
7645 SET @CurrentPageCount = NULL
7646 SET @CurrentFragmentationGroup = NULL
7647 SET @CurrentAction = NULL
7648 SET @CurrentMaxDOP = NULL
7649 SET @CurrentUpdateStatistics = NULL
7650 SET @CurrentStatisticsSample = NULL
7651 SET @CurrentStatisticsResample = NULL
7652 SET @CurrentAlterIndexArgumentID = NULL
7653 SET @CurrentAlterIndexArgument = NULL
7654 SET @CurrentAlterIndexWithClause = NULL
7655 SET @CurrentUpdateStatisticsArgumentID = NULL
7656 SET @CurrentUpdateStatisticsArgument = NULL
7657 SET @CurrentUpdateStatisticsWithClause = NULL
7658
7659 DELETE FROM @CurrentActionsAllowed
7660 DELETE FROM @CurrentAlterIndexWithClauseArguments
7661 DELETE FROM @CurrentUpdateStatisticsWithClauseArguments
7662
7663 END
7664
7665 END
7666
7667 IF DATABASEPROPERTYEX(@CurrentDatabaseName,'Status') = 'SUSPECT'
7668 BEGIN
7669 SET @ErrorMessage = 'The database ' + QUOTENAME(@CurrentDatabaseName) + ' is in a SUSPECT state.'
7670 RAISERROR('%s',16,1,@ErrorMessage) WITH NOWAIT
7671 RAISERROR(@EmptyLine,10,1) WITH NOWAIT
7672 SET @Error = @@ERROR
7673 END
7674
7675 -- Update that the database is completed
7676 IF @DatabasesInParallel = 'Y'
7677 BEGIN
7678 UPDATE dbo.QueueDatabase
7679 SET DatabaseEndTime = GETDATE()
7680 WHERE QueueID = @QueueID
7681 AND DatabaseName = @CurrentDatabaseName
7682 END
7683 ELSE
7684 BEGIN
7685 UPDATE @tmpDatabases
7686 SET Completed = 1
7687 WHERE Selected = 1
7688 AND Completed = 0
7689 AND ID = @CurrentDBID
7690 END
7691
7692 -- Clear variables
7693 SET @CurrentDBID = NULL
7694 SET @CurrentDatabaseID = NULL
7695 SET @CurrentDatabaseName = NULL
7696 SET @CurrentIsDatabaseAccessible = NULL
7697 SET @CurrentAvailabilityGroup = NULL
7698 SET @CurrentAvailabilityGroupRole = NULL
7699 SET @CurrentDatabaseMirroringRole = NULL
7700 SET @CurrentIsReadOnly = NULL
7701
7702 SET @CurrentCommand01 = NULL
7703
7704 DELETE FROM @tmpIndexesStatistics
7705
7706 END
7707
7708 ----------------------------------------------------------------------------------------------------
7709 --// Log completing information //--
7710 ----------------------------------------------------------------------------------------------------
7711
7712 Logging:
7713 SET @EndMessage = 'Date and time: ' + CONVERT(nvarchar,GETDATE(),120)
7714 RAISERROR('%s',10,1,@EndMessage) WITH NOWAIT
7715
7716 IF @ReturnCode <> 0
7717 BEGIN
7718 RETURN @ReturnCode
7719 END
7720
7721 ----------------------------------------------------------------------------------------------------
7722
7723END
7724
7725GO
7726IF (SELECT [Value] FROM #Config WHERE Name = 'CreateJobs') = 'Y' AND SERVERPROPERTY('EngineEdition') NOT IN(4, 5) AND (IS_SRVROLEMEMBER('sysadmin') = 1 OR (DB_ID('rdsadmin') IS NOT NULL AND SUSER_SNAME(0x01) = 'rdsa')) AND (SELECT [compatibility_level] FROM sys.databases WHERE database_id = DB_ID()) >= 90
7727BEGIN
7728
7729 DECLARE @BackupDirectory nvarchar(max)
7730 DECLARE @CleanupTime int
7731 DECLARE @OutputFileDirectory nvarchar(max)
7732 DECLARE @LogToTable nvarchar(max)
7733 DECLARE @DatabaseName nvarchar(max)
7734
7735 DECLARE @Version numeric(18,10)
7736 DECLARE @HostPlatform nvarchar(max)
7737 DECLARE @AmazonRDS bit
7738 DECLARE @DirectorySeparator nvarchar(max)
7739 DECLARE @LogDirectory nvarchar(max)
7740
7741 DECLARE @TokenServer nvarchar(max)
7742 DECLARE @TokenJobID nvarchar(max)
7743 DECLARE @TokenJobName nvarchar(max)
7744 DECLARE @TokenStepID nvarchar(max)
7745 DECLARE @TokenStepName nvarchar(max)
7746 DECLARE @TokenDate nvarchar(max)
7747 DECLARE @TokenTime nvarchar(max)
7748 DECLARE @TokenLogDirectory nvarchar(max)
7749
7750 DECLARE @JobDescription nvarchar(max)
7751 DECLARE @JobCategory nvarchar(max)
7752 DECLARE @JobOwner nvarchar(max)
7753
7754 DECLARE @Jobs TABLE (JobID int IDENTITY,
7755 [Name] nvarchar(max),
7756 CommandTSQL nvarchar(max),
7757 CommandCmdExec nvarchar(max),
7758 DatabaseName varchar(max),
7759 OutputFileNamePart01 nvarchar(max),
7760 OutputFileNamePart02 nvarchar(max),
7761 Selected bit DEFAULT 0,
7762 Completed bit DEFAULT 0)
7763
7764 DECLARE @CurrentJobID int
7765 DECLARE @CurrentJobName nvarchar(max)
7766 DECLARE @CurrentCommandTSQL nvarchar(max)
7767 DECLARE @CurrentCommandCmdExec nvarchar(max)
7768 DECLARE @CurrentDatabaseName nvarchar(max)
7769 DECLARE @CurrentOutputFileNamePart01 nvarchar(max)
7770 DECLARE @CurrentOutputFileNamePart02 nvarchar(max)
7771
7772 DECLARE @CurrentJobStepCommand nvarchar(max)
7773 DECLARE @CurrentJobStepSubSystem nvarchar(max)
7774 DECLARE @CurrentJobStepDatabaseName nvarchar(max)
7775 DECLARE @CurrentOutputFileName nvarchar(max)
7776
7777 SET @Version = CAST(LEFT(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max)),CHARINDEX('.',CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max))) - 1) + '.' + REPLACE(RIGHT(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max)), LEN(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max))) - CHARINDEX('.',CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max)))),'.','') AS numeric(18,10))
7778
7779 SET @AmazonRDS = CASE WHEN DB_ID('rdsadmin') IS NOT NULL AND SUSER_SNAME(0x01) = 'rdsa' THEN 1 ELSE 0 END
7780
7781 IF @Version >= 14
7782 BEGIN
7783 SELECT @HostPlatform = host_platform
7784 FROM sys.dm_os_host_info
7785 END
7786 ELSE
7787 BEGIN
7788 SET @HostPlatform = 'Windows'
7789 END
7790
7791 SELECT @DirectorySeparator = CASE
7792 WHEN @HostPlatform = 'Windows' THEN '\'
7793 WHEN @HostPlatform = 'Linux' THEN '/'
7794 END
7795
7796 IF @Version >= 9.002047
7797 BEGIN
7798 SET @TokenServer = '$' + '(ESCAPE_SQUOTE(SRVR))'
7799 SET @TokenJobID = '$' + '(ESCAPE_SQUOTE(JOBID))'
7800 SET @TokenStepID = '$' + '(ESCAPE_SQUOTE(STEPID))'
7801 SET @TokenDate = '$' + '(ESCAPE_SQUOTE(STRTDT))'
7802 SET @TokenTime = '$' + '(ESCAPE_SQUOTE(STRTTM))'
7803 END
7804 ELSE
7805 BEGIN
7806 SET @TokenServer = '$' + '(SRVR)'
7807 SET @TokenJobID = '$' + '(JOBID)'
7808 SET @TokenStepID = '$' + '(STEPID)'
7809 SET @TokenDate = '$' + '(STRTDT)'
7810 SET @TokenTime = '$' + '(STRTTM)'
7811 END
7812
7813 IF @Version >= 13
7814 BEGIN
7815 SET @TokenJobName = '$' + '(ESCAPE_SQUOTE(JOBNAME))'
7816 SET @TokenStepName = '$' + '(ESCAPE_SQUOTE(STEPNAME))'
7817 END
7818
7819 IF @Version >= 12 AND @HostPlatform = 'Windows'
7820 BEGIN
7821 SET @TokenLogDirectory = '$' + '(ESCAPE_SQUOTE(SQLLOGDIR))'
7822 END
7823
7824 SELECT @BackupDirectory = Value
7825 FROM #Config
7826 WHERE [Name] = 'BackupDirectory'
7827
7828 IF @HostPlatform = 'Windows'
7829 BEGIN
7830 SELECT @CleanupTime = Value
7831 FROM #Config
7832 WHERE [Name] = 'CleanupTime'
7833 END
7834
7835 SELECT @OutputFileDirectory = Value
7836 FROM #Config
7837 WHERE [Name] = 'OutputFileDirectory'
7838
7839 SELECT @LogToTable = Value
7840 FROM #Config
7841 WHERE [Name] = 'LogToTable'
7842
7843 SELECT @DatabaseName = Value
7844 FROM #Config
7845 WHERE [Name] = 'DatabaseName'
7846
7847 IF @Version >= 11
7848 BEGIN
7849 SELECT @LogDirectory = [path]
7850 FROM sys.dm_os_server_diagnostics_log_configurations
7851 END
7852 ELSE
7853 BEGIN
7854 SELECT @LogDirectory = LEFT(CAST(SERVERPROPERTY('ErrorLogFileName') AS nvarchar(max)),LEN(CAST(SERVERPROPERTY('ErrorLogFileName') AS nvarchar(max))) - CHARINDEX('\',REVERSE(CAST(SERVERPROPERTY('ErrorLogFileName') AS nvarchar(max)))))
7855 END
7856
7857 IF @OutputFileDirectory IS NOT NULL AND RIGHT(@OutputFileDirectory,1) = @DirectorySeparator
7858 BEGIN
7859 SET @OutputFileDirectory = LEFT(@OutputFileDirectory, LEN(@OutputFileDirectory) - 1)
7860 END
7861
7862 IF @LogDirectory IS NOT NULL AND RIGHT(@LogDirectory,1) = @DirectorySeparator
7863 BEGIN
7864 SET @LogDirectory = LEFT(@LogDirectory, LEN(@LogDirectory) - 1)
7865 END
7866
7867 SET @JobDescription = 'Source: https://ola.hallengren.com'
7868 SET @JobCategory = 'Database Maintenance'
7869
7870 IF @AmazonRDS = 0
7871 BEGIN
7872 SET @JobOwner = SUSER_SNAME(0x01)
7873 END
7874
7875 INSERT INTO @Jobs ([Name], CommandTSQL, DatabaseName, OutputFileNamePart01, OutputFileNamePart02)
7876 SELECT 'DatabaseBackup - SYSTEM_DATABASES - FULL',
7877 'EXECUTE [dbo].[DatabaseBackup]' + CHAR(13) + CHAR(10) + '@Databases = ''SYSTEM_DATABASES'',' + CHAR(13) + CHAR(10) + '@Directory = ' + ISNULL('N''' + REPLACE(@BackupDirectory,'''','''''') + '''','NULL') + ',' + CHAR(13) + CHAR(10) + '@BackupType = ''FULL'',' + CHAR(13) + CHAR(10) + '@Verify = ''Y'',' + CHAR(13) + CHAR(10) + '@CleanupTime = ' + ISNULL(CAST(@CleanupTime AS nvarchar),'NULL') + ',' + CHAR(13) + CHAR(10) + '@CheckSum = ''Y'',' + CHAR(13) + CHAR(10) + '@LogToTable = ''' + @LogToTable + '''',
7878 @DatabaseName,
7879 'DatabaseBackup',
7880 'FULL'
7881
7882 INSERT INTO @Jobs ([Name], CommandTSQL, DatabaseName, OutputFileNamePart01, OutputFileNamePart02)
7883 SELECT 'DatabaseBackup - USER_DATABASES - DIFF',
7884 'EXECUTE [dbo].[DatabaseBackup]' + CHAR(13) + CHAR(10) + '@Databases = ''USER_DATABASES'',' + CHAR(13) + CHAR(10) + '@Directory = ' + ISNULL('N''' + REPLACE(@BackupDirectory,'''','''''') + '''','NULL') + ',' + CHAR(13) + CHAR(10) + '@BackupType = ''DIFF'',' + CHAR(13) + CHAR(10) + '@Verify = ''Y'',' + CHAR(13) + CHAR(10) + '@CleanupTime = ' + ISNULL(CAST(@CleanupTime AS nvarchar),'NULL') + ',' + CHAR(13) + CHAR(10) + '@CheckSum = ''Y'',' + CHAR(13) + CHAR(10) + '@LogToTable = ''' + @LogToTable + '''',
7885 @DatabaseName,
7886 'DatabaseBackup',
7887 'DIFF'
7888
7889 INSERT INTO @Jobs ([Name], CommandTSQL, DatabaseName, OutputFileNamePart01, OutputFileNamePart02)
7890 SELECT 'DatabaseBackup - USER_DATABASES - FULL',
7891 'EXECUTE [dbo].[DatabaseBackup]' + CHAR(13) + CHAR(10) + '@Databases = ''USER_DATABASES'',' + CHAR(13) + CHAR(10) + '@Directory = ' + ISNULL('N''' + REPLACE(@BackupDirectory,'''','''''') + '''','NULL') + ',' + CHAR(13) + CHAR(10) + '@BackupType = ''FULL'',' + CHAR(13) + CHAR(10) + '@Verify = ''Y'',' + CHAR(13) + CHAR(10) + '@CleanupTime = ' + ISNULL(CAST(@CleanupTime AS nvarchar),'NULL') + ',' + CHAR(13) + CHAR(10) + '@CheckSum = ''Y'',' + CHAR(13) + CHAR(10) + '@LogToTable = ''' + @LogToTable + '''',
7892 @DatabaseName,
7893 'DatabaseBackup',
7894 'FULL'
7895
7896 INSERT INTO @Jobs ([Name], CommandTSQL, DatabaseName, OutputFileNamePart01, OutputFileNamePart02)
7897 SELECT 'DatabaseBackup - USER_DATABASES - LOG',
7898 'EXECUTE [dbo].[DatabaseBackup]' + CHAR(13) + CHAR(10) + '@Databases = ''USER_DATABASES'',' + CHAR(13) + CHAR(10) + '@Directory = ' + ISNULL('N''' + REPLACE(@BackupDirectory,'''','''''') + '''','NULL') + ',' + CHAR(13) + CHAR(10) + '@BackupType = ''LOG'',' + CHAR(13) + CHAR(10) + '@Verify = ''Y'',' + CHAR(13) + CHAR(10) + '@CleanupTime = ' + ISNULL(CAST(@CleanupTime AS nvarchar),'NULL') + ',' + CHAR(13) + CHAR(10) + '@CheckSum = ''Y'',' + CHAR(13) + CHAR(10) + '@LogToTable = ''' + @LogToTable + '''',
7899 @DatabaseName,
7900 'DatabaseBackup',
7901 'LOG'
7902
7903 INSERT INTO @Jobs ([Name], CommandTSQL, DatabaseName, OutputFileNamePart01)
7904 SELECT 'DatabaseIntegrityCheck - SYSTEM_DATABASES',
7905 'EXECUTE [dbo].[DatabaseIntegrityCheck]' + CHAR(13) + CHAR(10) + '@Databases = ''SYSTEM_DATABASES'',' + CHAR(13) + CHAR(10) + '@LogToTable = ''' + @LogToTable + '''',
7906 @DatabaseName,
7907 'DatabaseIntegrityCheck'
7908
7909 INSERT INTO @Jobs ([Name], CommandTSQL, DatabaseName, OutputFileNamePart01)
7910 SELECT 'DatabaseIntegrityCheck - USER_DATABASES',
7911 'EXECUTE [dbo].[DatabaseIntegrityCheck]' + CHAR(13) + CHAR(10) + '@Databases = ''USER_DATABASES' + CASE WHEN @AmazonRDS = 1 THEN ', -rdsadmin' ELSE '' END + ''',' + CHAR(13) + CHAR(10) + '@LogToTable = ''' + @LogToTable + '''',
7912 @DatabaseName,
7913 'DatabaseIntegrityCheck'
7914
7915 INSERT INTO @Jobs ([Name], CommandTSQL, DatabaseName, OutputFileNamePart01)
7916 SELECT 'IndexOptimize - USER_DATABASES',
7917 'EXECUTE [dbo].[IndexOptimize]' + CHAR(13) + CHAR(10) + '@Databases = ''USER_DATABASES'',' + CHAR(13) + CHAR(10) + '@LogToTable = ''' + @LogToTable + '''',
7918 @DatabaseName,
7919 'IndexOptimize'
7920
7921 INSERT INTO @Jobs ([Name], CommandTSQL, DatabaseName, OutputFileNamePart01)
7922 SELECT 'sp_delete_backuphistory',
7923 'DECLARE @CleanupDate datetime' + CHAR(13) + CHAR(10) + 'SET @CleanupDate = DATEADD(dd,-30,GETDATE())' + CHAR(13) + CHAR(10) + 'EXECUTE dbo.sp_delete_backuphistory @oldest_date = @CleanupDate',
7924 'msdb',
7925 'sp_delete_backuphistory'
7926
7927 INSERT INTO @Jobs ([Name], CommandTSQL, DatabaseName, OutputFileNamePart01)
7928 SELECT 'sp_purge_jobhistory',
7929 'DECLARE @CleanupDate datetime' + CHAR(13) + CHAR(10) + 'SET @CleanupDate = DATEADD(dd,-30,GETDATE())' + CHAR(13) + CHAR(10) + 'EXECUTE dbo.sp_purge_jobhistory @oldest_date = @CleanupDate',
7930 'msdb',
7931 'sp_purge_jobhistory'
7932
7933 INSERT INTO @Jobs ([Name], CommandTSQL, DatabaseName, OutputFileNamePart01)
7934 SELECT 'CommandLog Cleanup',
7935 'DELETE FROM [dbo].[CommandLog]' + CHAR(13) + CHAR(10) + 'WHERE StartTime < DATEADD(dd,-30,GETDATE())',
7936 @DatabaseName,
7937 'CommandLogCleanup'
7938
7939 INSERT INTO @Jobs ([Name], CommandCmdExec, OutputFileNamePart01)
7940 SELECT 'Output File Cleanup',
7941 'cmd /q /c "For /F "tokens=1 delims=" %v In (''ForFiles /P "' + COALESCE(@OutputFileDirectory,@TokenLogDirectory,@LogDirectory) + '" /m *_*_*_*.txt /d -30 2^>^&1'') do if EXIST "' + COALESCE(@OutputFileDirectory,@TokenLogDirectory,@LogDirectory) + '"\%v echo del "' + COALESCE(@OutputFileDirectory,@TokenLogDirectory,@LogDirectory) + '"\%v& del "' + COALESCE(@OutputFileDirectory,@TokenLogDirectory,@LogDirectory) + '"\%v"',
7942 'OutputFileCleanup'
7943
7944 IF @AmazonRDS = 1
7945 BEGIN
7946 UPDATE @Jobs
7947 SET Selected = 1
7948 WHERE [Name] IN('DatabaseIntegrityCheck - USER_DATABASES','IndexOptimize - USER_DATABASES','CommandLog Cleanup')
7949 END
7950 ELSE IF SERVERPROPERTY('EngineEdition') = 8
7951 BEGIN
7952 UPDATE @Jobs
7953 SET Selected = 1
7954 WHERE [Name] IN('DatabaseIntegrityCheck - SYSTEM_DATABASES','DatabaseIntegrityCheck - USER_DATABASES','IndexOptimize - USER_DATABASES','CommandLog Cleanup','sp_delete_backuphistory','sp_purge_jobhistory')
7955 END
7956 ELSE IF @HostPlatform = 'Windows'
7957 BEGIN
7958 UPDATE @Jobs
7959 SET Selected = 1
7960 END
7961 ELSE IF @HostPlatform = 'Linux'
7962 BEGIN
7963 UPDATE @Jobs
7964 SET Selected = 1
7965 WHERE CommandTSQL IS NOT NULL
7966 END
7967
7968 WHILE EXISTS (SELECT * FROM @Jobs WHERE Completed = 0 AND Selected = 1)
7969 BEGIN
7970 SELECT @CurrentJobID = JobID,
7971 @CurrentJobName = [Name],
7972 @CurrentCommandTSQL = CommandTSQL,
7973 @CurrentCommandCmdExec = CommandCmdExec,
7974 @CurrentDatabaseName = DatabaseName,
7975 @CurrentOutputFileNamePart01 = OutputFileNamePart01,
7976 @CurrentOutputFileNamePart02 = OutputFileNamePart02
7977 FROM @Jobs
7978 WHERE Completed = 0
7979 AND Selected = 1
7980 ORDER BY JobID ASC
7981
7982 IF @CurrentCommandTSQL IS NOT NULL AND @AmazonRDS = 1
7983 BEGIN
7984 SET @CurrentJobStepSubSystem = 'TSQL'
7985 SET @CurrentJobStepCommand = @CurrentCommandTSQL
7986 SET @CurrentJobStepDatabaseName = @CurrentDatabaseName
7987 END
7988 ELSE IF @CurrentCommandTSQL IS NOT NULL AND SERVERPROPERTY('EngineEdition') = 8
7989 BEGIN
7990 SET @CurrentJobStepSubSystem = 'TSQL'
7991 SET @CurrentJobStepCommand = @CurrentCommandTSQL
7992 SET @CurrentJobStepDatabaseName = @CurrentDatabaseName
7993 END
7994 ELSE IF @CurrentCommandTSQL IS NOT NULL AND @HostPlatform = 'Linux'
7995 BEGIN
7996 SET @CurrentJobStepSubSystem = 'TSQL'
7997 SET @CurrentJobStepCommand = @CurrentCommandTSQL
7998 SET @CurrentJobStepDatabaseName = @CurrentDatabaseName
7999 END
8000 ELSE IF @CurrentCommandTSQL IS NOT NULL AND @HostPlatform = 'Windows' AND @Version >= 11
8001 BEGIN
8002 SET @CurrentJobStepSubSystem = 'TSQL'
8003 SET @CurrentJobStepCommand = @CurrentCommandTSQL
8004 SET @CurrentJobStepDatabaseName = @CurrentDatabaseName
8005 END
8006 ELSE IF @CurrentCommandTSQL IS NOT NULL AND @HostPlatform = 'Windows' AND @Version < 11
8007 BEGIN
8008 SET @CurrentJobStepSubSystem = 'CMDEXEC'
8009 SET @CurrentJobStepCommand = 'sqlcmd -E -S ' + @TokenServer + ' -d ' + @CurrentDatabaseName + ' -Q "' + REPLACE(@CurrentCommandTSQL,(CHAR(13) + CHAR(10)),' ') + '" -b'
8010 SET @CurrentJobStepDatabaseName = NULL
8011 END
8012 ELSE IF @CurrentCommandCmdExec IS NOT NULL AND @HostPlatform = 'Windows'
8013 BEGIN
8014 SET @CurrentJobStepSubSystem = 'CMDEXEC'
8015 SET @CurrentJobStepCommand = @CurrentCommandCmdExec
8016 SET @CurrentJobStepDatabaseName = NULL
8017 END
8018
8019 IF @AmazonRDS = 0 AND SERVERPROPERTY('EngineEdition') <> 8
8020 BEGIN
8021 SET @CurrentOutputFileName = COALESCE(@OutputFileDirectory,@TokenLogDirectory,@LogDirectory) + @DirectorySeparator + ISNULL(CASE WHEN @TokenJobName IS NULL THEN @CurrentOutputFileNamePart01 END + '_','') + ISNULL(CASE WHEN @TokenJobName IS NULL THEN @CurrentOutputFileNamePart02 END + '_','') + ISNULL(@TokenJobName,@TokenJobID) + '_' + @TokenStepID + '_' + @TokenDate + '_' + @TokenTime + '.txt'
8022 IF LEN(@CurrentOutputFileName) > 200 SET @CurrentOutputFileName = COALESCE(@OutputFileDirectory,@TokenLogDirectory,@LogDirectory) + @DirectorySeparator + ISNULL(CASE WHEN @TokenJobName IS NULL THEN @CurrentOutputFileNamePart01 END + '_','') + ISNULL(@TokenJobName,@TokenJobID) + '_' + @TokenStepID + '_' + @TokenDate + '_' + @TokenTime + '.txt'
8023 IF LEN(@CurrentOutputFileName) > 200 SET @CurrentOutputFileName = COALESCE(@OutputFileDirectory,@TokenLogDirectory,@LogDirectory) + @DirectorySeparator + ISNULL(@TokenJobName,@TokenJobID) + '_' + @TokenStepID + '_' + @TokenDate + '_' + @TokenTime + '.txt'
8024 IF LEN(@CurrentOutputFileName) > 200 SET @CurrentOutputFileName = NULL
8025 END
8026
8027 IF @CurrentJobStepSubSystem IS NOT NULL AND @CurrentJobStepCommand IS NOT NULL AND NOT EXISTS (SELECT * FROM msdb.dbo.sysjobs WHERE [name] = @CurrentJobName)
8028 BEGIN
8029 EXECUTE msdb.dbo.sp_add_job @job_name = @CurrentJobName, @description = @JobDescription, @category_name = @JobCategory, @owner_login_name = @JobOwner
8030 EXECUTE msdb.dbo.sp_add_jobstep @job_name = @CurrentJobName, @step_name = @CurrentJobName, @subsystem = @CurrentJobStepSubSystem, @command = @CurrentJobStepCommand, @output_file_name = @CurrentOutputFileName, @database_name = @CurrentJobStepDatabaseName
8031 EXECUTE msdb.dbo.sp_add_jobserver @job_name = @CurrentJobName
8032 END
8033
8034 UPDATE Jobs
8035 SET Completed = 1
8036 FROM @Jobs Jobs
8037 WHERE JobID = @CurrentJobID
8038
8039 SET @CurrentJobID = NULL
8040 SET @CurrentJobName = NULL
8041 SET @CurrentCommandTSQL = NULL
8042 SET @CurrentCommandCmdExec = NULL
8043 SET @CurrentDatabaseName = NULL
8044 SET @CurrentOutputFileNamePart01 = NULL
8045 SET @CurrentOutputFileNamePart02 = NULL
8046 SET @CurrentJobStepCommand = NULL
8047 SET @CurrentJobStepSubSystem = NULL
8048 SET @CurrentJobStepDatabaseName = NULL
8049 SET @CurrentOutputFileName = NULL
8050
8051 END
8052
8053END
8054GO