· 7 years ago · Dec 11, 2018, 01:46 PM
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
5*/
6
7USE [master] -- Specify the database in which the objects will be created.
8
9SET NOCOUNT ON
10
11DECLARE @CreateJobs nvarchar(max)
12DECLARE @BackupDirectory nvarchar(max)
13DECLARE @CleanupTime int
14DECLARE @OutputFileDirectory nvarchar(max)
15DECLARE @LogToTable nvarchar(max)
16DECLARE @ErrorMessage nvarchar(max)
17
18SET @CreateJobs = 'Y' -- Specify whether jobs should be created.
19SET @BackupDirectory = NULL -- Specify the backup root directory. If no directory is specified, the default backup directory is used.
20SET @CleanupTime = NULL -- Time in hours, after which backup files are deleted. If no time is specified, then no backup files are deleted.
21SET @OutputFileDirectory = NULL -- Specify the output file directory. If no directory is specified, then the SQL Server error log directory is used.
22SET @LogToTable = 'Y' -- Log commands to a table.
23
24IF IS_SRVROLEMEMBER('sysadmin') = 0 AND NOT (DB_ID('rdsadmin') IS NOT NULL AND SUSER_SNAME(0x01) = 'rdsa')
25BEGIN
26 SET @ErrorMessage = 'You need to be a member of the SysAdmin server role to install the SQL Server Maintenance Solution.' + CHAR(13) + CHAR(10) + ' '
27 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
28END
29
30IF NOT (SELECT [compatibility_level] FROM sys.databases WHERE database_id = DB_ID()) >= 90
31BEGIN
32 SET @ErrorMessage = 'The database ' + QUOTENAME(DB_NAME(DB_ID())) + ' has to be in compatibility level 90 or higher.' + CHAR(13) + CHAR(10) + ' '
33 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
34END
35
36IF OBJECT_ID('tempdb..#Config') IS NOT NULL DROP TABLE #Config
37
38CREATE TABLE #Config ([Name] nvarchar(max),
39 [Value] nvarchar(max))
40
41INSERT INTO #Config ([Name], [Value]) VALUES('CreateJobs', @CreateJobs)
42INSERT INTO #Config ([Name], [Value]) VALUES('BackupDirectory', @BackupDirectory)
43INSERT INTO #Config ([Name], [Value]) VALUES('CleanupTime', @CleanupTime)
44INSERT INTO #Config ([Name], [Value]) VALUES('OutputFileDirectory', @OutputFileDirectory)
45INSERT INTO #Config ([Name], [Value]) VALUES('LogToTable', @LogToTable)
46INSERT INTO #Config ([Name], [Value]) VALUES('DatabaseName', DB_NAME(DB_ID()))
47GO
48SET ANSI_NULLS ON
49GO
50SET QUOTED_IDENTIFIER ON
51GO
52IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[CommandLog]') AND type in (N'U'))
53BEGIN
54CREATE TABLE [dbo].[CommandLog](
55 [ID] [int] IDENTITY(1,1) NOT NULL,
56 [DatabaseName] [sysname] NULL,
57 [SchemaName] [sysname] NULL,
58 [ObjectName] [sysname] NULL,
59 [ObjectType] [char](2) NULL,
60 [IndexName] [sysname] NULL,
61 [IndexType] [tinyint] NULL,
62 [StatisticsName] [sysname] NULL,
63 [PartitionNumber] [int] NULL,
64 [ExtendedInfo] [xml] NULL,
65 [Command] [nvarchar](max) NOT NULL,
66 [CommandType] [nvarchar](60) NOT NULL,
67 [StartTime] [datetime] NOT NULL,
68 [EndTime] [datetime] NULL,
69 [ErrorNumber] [int] NULL,
70 [ErrorMessage] [nvarchar](max) NULL,
71 CONSTRAINT [PK_CommandLog] PRIMARY KEY CLUSTERED
72(
73 [ID] ASC
74)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
75)
76END
77GO
78SET ANSI_NULLS ON
79GO
80SET QUOTED_IDENTIFIER ON
81GO
82IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[CommandExecute]') AND type in (N'P', N'PC'))
83BEGIN
84EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[CommandExecute] AS'
85END
86GO
87ALTER PROCEDURE [dbo].[CommandExecute]
88
89@Command nvarchar(max),
90@CommandType nvarchar(max),
91@Mode int,
92@Comment nvarchar(max) = NULL,
93@DatabaseName nvarchar(max) = NULL,
94@SchemaName nvarchar(max) = NULL,
95@ObjectName nvarchar(max) = NULL,
96@ObjectType nvarchar(max) = NULL,
97@IndexName nvarchar(max) = NULL,
98@IndexType int = NULL,
99@StatisticsName nvarchar(max) = NULL,
100@PartitionNumber int = NULL,
101@ExtendedInfo xml = NULL,
102@LockMessageSeverity int = 16,
103@LogToTable nvarchar(max),
104@Execute nvarchar(max)
105
106AS
107
108BEGIN
109
110 SET NOCOUNT ON
111
112 DECLARE @StartMessage nvarchar(max)
113 DECLARE @EndMessage nvarchar(max)
114 DECLARE @ErrorMessage nvarchar(max)
115 DECLARE @ErrorMessageOriginal nvarchar(max)
116 DECLARE @Severity int
117
118 DECLARE @StartTime datetime
119 DECLARE @EndTime datetime
120
121 DECLARE @StartTimeSec datetime
122 DECLARE @EndTimeSec datetime
123
124 DECLARE @ID int
125
126 DECLARE @Error int
127 DECLARE @ReturnCode int
128
129 SET @Error = 0
130 SET @ReturnCode = 0
131
132 ----------------------------------------------------------------------------------------------------
133 --// Check core requirements //--
134 ----------------------------------------------------------------------------------------------------
135
136 IF NOT (SELECT [compatibility_level] FROM sys.databases WHERE database_id = DB_ID()) >= 90
137 BEGIN
138 SET @ErrorMessage = 'The database ' + QUOTENAME(DB_NAME(DB_ID())) + ' has to be in compatibility level 90 or higher.' + CHAR(13) + CHAR(10) + ' '
139 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
140 SET @Error = @@ERROR
141 END
142
143 IF NOT (SELECT uses_ansi_nulls FROM sys.sql_modules WHERE [object_id] = @@PROCID) = 1
144 BEGIN
145 SET @ErrorMessage = 'ANSI_NULLS has to be set to ON for the stored procedure.' + CHAR(13) + CHAR(10) + ' '
146 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
147 SET @Error = @@ERROR
148 END
149
150 IF NOT (SELECT uses_quoted_identifier FROM sys.sql_modules WHERE [object_id] = @@PROCID) = 1
151 BEGIN
152 SET @ErrorMessage = 'QUOTED_IDENTIFIER has to be set to ON for the stored procedure.' + CHAR(13) + CHAR(10) + ' '
153 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
154 SET @Error = @@ERROR
155 END
156
157 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')
158 BEGIN
159 SET @ErrorMessage = 'The table CommandLog is missing. Download https://FixSQL.co.uk/scripts/CommandLog.sql.' + CHAR(13) + CHAR(10) + ' '
160 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
161 SET @Error = @@ERROR
162 END
163
164 IF @Error <> 0
165 BEGIN
166 SET @ReturnCode = @Error
167 GOTO ReturnCode
168 END
169
170 ----------------------------------------------------------------------------------------------------
171 --// Check input parameters //--
172 ----------------------------------------------------------------------------------------------------
173
174 IF @Command IS NULL OR @Command = ''
175 BEGIN
176 SET @ErrorMessage = 'The value for the parameter @Command is not supported.' + CHAR(13) + CHAR(10) + ' '
177 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
178 SET @Error = @@ERROR
179 END
180
181 IF @CommandType IS NULL OR @CommandType = '' OR LEN(@CommandType) > 60
182 BEGIN
183 SET @ErrorMessage = 'The value for the parameter @CommandType is not supported.' + CHAR(13) + CHAR(10) + ' '
184 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
185 SET @Error = @@ERROR
186 END
187
188 IF @Mode NOT IN(1,2) OR @Mode IS NULL
189 BEGIN
190 SET @ErrorMessage = 'The value for the parameter @Mode is not supported.' + CHAR(13) + CHAR(10) + ' '
191 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
192 SET @Error = @@ERROR
193 END
194
195 IF @LockMessageSeverity NOT IN(10,16) OR @LockMessageSeverity IS NULL
196 BEGIN
197 SET @ErrorMessage = 'The value for the parameter @LockMessageSeverity is not supported.' + CHAR(13) + CHAR(10) + ' '
198 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
199 SET @Error = @@ERROR
200 END
201
202 IF @LogToTable NOT IN('Y','N') OR @LogToTable IS NULL
203 BEGIN
204 SET @ErrorMessage = 'The value for the parameter @LogToTable is not supported.' + CHAR(13) + CHAR(10) + ' '
205 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
206 SET @Error = @@ERROR
207 END
208
209 IF @Execute NOT IN('Y','N') OR @Execute IS NULL
210 BEGIN
211 SET @ErrorMessage = 'The value for the parameter @Execute is not supported.' + CHAR(13) + CHAR(10) + ' '
212 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
213 SET @Error = @@ERROR
214 END
215
216 IF @Error <> 0
217 BEGIN
218 SET @ReturnCode = @Error
219 GOTO ReturnCode
220 END
221
222 ----------------------------------------------------------------------------------------------------
223 --// Log initial information //--
224 ----------------------------------------------------------------------------------------------------
225
226 SET @StartTime = GETDATE()
227 SET @StartTimeSec = CONVERT(datetime,CONVERT(nvarchar,@StartTime,120),120)
228
229 SET @StartMessage = 'Date and time: ' + CONVERT(nvarchar,@StartTimeSec,120)
230 RAISERROR(@StartMessage,10,1) WITH NOWAIT
231
232 SET @StartMessage = 'Command: ' + @Command
233 SET @StartMessage = REPLACE(@StartMessage,'%','%%')
234 RAISERROR(@StartMessage,10,1) WITH NOWAIT
235
236 IF @Comment IS NOT NULL
237 BEGIN
238 SET @StartMessage = 'Comment: ' + @Comment
239 SET @StartMessage = REPLACE(@StartMessage,'%','%%')
240 RAISERROR(@StartMessage,10,1) WITH NOWAIT
241 END
242
243 IF @LogToTable = 'Y'
244 BEGIN
245 INSERT INTO dbo.CommandLog (DatabaseName, SchemaName, ObjectName, ObjectType, IndexName, IndexType, StatisticsName, PartitionNumber, ExtendedInfo, CommandType, Command, StartTime)
246 VALUES (@DatabaseName, @SchemaName, @ObjectName, @ObjectType, @IndexName, @IndexType, @StatisticsName, @PartitionNumber, @ExtendedInfo, @CommandType, @Command, @StartTime)
247 END
248
249 SET @ID = SCOPE_IDENTITY()
250
251 ----------------------------------------------------------------------------------------------------
252 --// Execute command //--
253 ----------------------------------------------------------------------------------------------------
254
255 IF @Mode = 1 AND @Execute = 'Y'
256 BEGIN
257 EXECUTE(@Command)
258 SET @Error = @@ERROR
259 SET @ReturnCode = @Error
260 END
261
262 IF @Mode = 2 AND @Execute = 'Y'
263 BEGIN
264 BEGIN TRY
265 EXECUTE(@Command)
266 END TRY
267 BEGIN CATCH
268 SET @Error = ERROR_NUMBER()
269 SET @ErrorMessageOriginal = ERROR_MESSAGE()
270
271 SET @ErrorMessage = 'Msg ' + CAST(ERROR_NUMBER() AS nvarchar) + ', ' + ISNULL(ERROR_MESSAGE(),'')
272 SET @Severity = CASE WHEN ERROR_NUMBER() IN(1205,1222) THEN @LockMessageSeverity ELSE 16 END
273 RAISERROR(@ErrorMessage,@Severity,1) WITH NOWAIT
274
275 IF NOT (ERROR_NUMBER() IN(1205,1222) AND @LockMessageSeverity = 10)
276 BEGIN
277 SET @ReturnCode = ERROR_NUMBER()
278 END
279 END CATCH
280 END
281
282 ----------------------------------------------------------------------------------------------------
283 --// Log completing information //--
284 ----------------------------------------------------------------------------------------------------
285
286 SET @EndTime = GETDATE()
287 SET @EndTimeSec = CONVERT(datetime,CONVERT(varchar,@EndTime,120),120)
288
289 SET @EndMessage = 'Outcome: ' + CASE WHEN @Execute = 'N' THEN 'Not Executed' WHEN @Error = 0 THEN 'Succeeded' ELSE 'Failed' END
290 RAISERROR(@EndMessage,10,1) WITH NOWAIT
291
292 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)
293 RAISERROR(@EndMessage,10,1) WITH NOWAIT
294
295 SET @EndMessage = 'Date and time: ' + CONVERT(nvarchar,@EndTimeSec,120) + CHAR(13) + CHAR(10) + ' '
296 RAISERROR(@EndMessage,10,1) WITH NOWAIT
297
298 IF @LogToTable = 'Y'
299 BEGIN
300 UPDATE dbo.CommandLog
301 SET EndTime = @EndTime,
302 ErrorNumber = CASE WHEN @Execute = 'N' THEN NULL ELSE @Error END,
303 ErrorMessage = @ErrorMessageOriginal
304 WHERE ID = @ID
305 END
306
307 ReturnCode:
308 IF @ReturnCode <> 0
309 BEGIN
310 RETURN @ReturnCode
311 END
312
313 ----------------------------------------------------------------------------------------------------
314
315END
316GO
317SET ANSI_NULLS ON
318GO
319SET QUOTED_IDENTIFIER ON
320GO
321IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[DatabaseBackup]') AND type in (N'P', N'PC'))
322BEGIN
323EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[DatabaseBackup] AS'
324END
325GO
326ALTER PROCEDURE [dbo].[DatabaseBackup]
327
328@Databases nvarchar(max) = NULL,
329@Directory nvarchar(max) = NULL,
330@BackupType nvarchar(max),
331@Verify nvarchar(max) = 'N',
332@CleanupTime int = NULL,
333@CleanupMode nvarchar(max) = 'AFTER_BACKUP',
334@Compress nvarchar(max) = NULL,
335@CopyOnly nvarchar(max) = 'N',
336@ChangeBackupType nvarchar(max) = 'N',
337@BackupSoftware nvarchar(max) = NULL,
338@CheckSum nvarchar(max) = 'N',
339@BlockSize int = NULL,
340@BufferCount int = NULL,
341@MaxTransferSize int = NULL,
342@NumberOfFiles int = NULL,
343@CompressionLevel int = NULL,
344@Description nvarchar(max) = NULL,
345@Threads int = NULL,
346@Throttle int = NULL,
347@Encrypt nvarchar(max) = 'N',
348@EncryptionAlgorithm nvarchar(max) = NULL,
349@ServerCertificate nvarchar(max) = NULL,
350@ServerAsymmetricKey nvarchar(max) = NULL,
351@EncryptionKey nvarchar(max) = NULL,
352@ReadWriteFileGroups nvarchar(max) = 'N',
353@OverrideBackupPreference nvarchar(max) = 'N',
354@NoRecovery nvarchar(max) = 'N',
355@URL nvarchar(max) = NULL,
356@Credential nvarchar(max) = NULL,
357@MirrorDirectory nvarchar(max) = NULL,
358@MirrorCleanupTime int = NULL,
359@MirrorCleanupMode nvarchar(max) = 'AFTER_BACKUP',
360@MirrorURL nvarchar(max) = NULL,
361@AvailabilityGroups nvarchar(max) = NULL,
362@Updateability nvarchar(max) = 'ALL',
363@AdaptiveCompression nvarchar(max) = NULL,
364@ModificationLevel int = NULL,
365@LogSizeSinceLastLogBackup int = NULL,
366@TimeSinceLastLogBackup int = NULL,
367@DataDomainBoostHost nvarchar(max) = NULL,
368@DataDomainBoostUser nvarchar(max) = NULL,
369@DataDomainBoostDevicePath nvarchar(max) = NULL,
370@DataDomainBoostLockboxPath nvarchar(max) = NULL,
371@DirectoryStructure nvarchar(max) = '{ServerName}${InstanceName}{DirectorySeparator}{DatabaseName}{DirectorySeparator}{BackupType}_{Partial}_{CopyOnly}',
372@AvailabilityGroupDirectoryStructure nvarchar(max) = '{ClusterName}${AvailabilityGroupName}{DirectorySeparator}{DatabaseName}{DirectorySeparator}{BackupType}_{Partial}_{CopyOnly}',
373@FileName nvarchar(max) = '{ServerName}${InstanceName}_{DatabaseName}_{BackupType}_{Partial}_{CopyOnly}_{Year}{Month}{Day}_{Hour}{Minute}{Second}_{FileNumber}.{FileExtension}',
374@AvailabilityGroupFileName nvarchar(max) = '{ClusterName}${AvailabilityGroupName}_{DatabaseName}_{BackupType}_{Partial}_{CopyOnly}_{Year}{Month}{Day}_{Hour}{Minute}{Second}_{FileNumber}.{FileExtension}',
375@FileExtensionFull nvarchar(max) = NULL,
376@FileExtensionDiff nvarchar(max) = NULL,
377@FileExtensionLog nvarchar(max) = NULL,
378@Init nvarchar(max) = 'N',
379@DatabaseOrder nvarchar(max) = NULL,
380@DatabasesInParallel nvarchar(max) = 'N',
381@LogToTable nvarchar(max) = 'N',
382@Execute nvarchar(max) = 'Y'
383
384AS
385
386BEGIN
387
388
389
390 SET NOCOUNT ON
391
392 DECLARE @StartMessage nvarchar(max)
393 DECLARE @EndMessage nvarchar(max)
394 DECLARE @DatabaseMessage nvarchar(max)
395 DECLARE @ErrorMessage nvarchar(max)
396
397 DECLARE @StartTime datetime
398 DECLARE @SchemaName nvarchar(max)
399 DECLARE @ObjectName nvarchar(max)
400 DECLARE @VersionTimestamp nvarchar(max)
401 DECLARE @Parameters nvarchar(max)
402
403 DECLARE @Version numeric(18,10)
404 DECLARE @HostPlatform nvarchar(max)
405 DECLARE @DirectorySeparator nvarchar(max)
406 DECLARE @AmazonRDS bit
407
408 DECLARE @Updated bit
409
410 DECLARE @Cluster nvarchar(max)
411
412 DECLARE @DefaultDirectory nvarchar(4000)
413
414 DECLARE @QueueID int
415 DECLARE @QueueStartTime datetime
416
417 DECLARE @CurrentRootDirectoryID int
418 DECLARE @CurrentRootDirectoryPath nvarchar(4000)
419
420 DECLARE @CurrentDBID int
421 DECLARE @CurrentDatabaseID int
422 DECLARE @CurrentDatabaseName nvarchar(max)
423 DECLARE @CurrentBackupType nvarchar(max)
424 DECLARE @CurrentFileExtension nvarchar(max)
425 DECLARE @CurrentFileNumber int
426 DECLARE @CurrentDifferentialBaseLSN numeric(25,0)
427 DECLARE @CurrentDifferentialBaseIsSnapshot bit
428 DECLARE @CurrentLogLSN numeric(25,0)
429 DECLARE @CurrentLatestBackup datetime
430 DECLARE @CurrentDatabaseNameFS nvarchar(max)
431 DECLARE @CurrentDirectoryStructure nvarchar(max)
432 DECLARE @CurrentDatabaseFileName nvarchar(max)
433 DECLARE @CurrentMaxFilePathLength nvarchar(max)
434 DECLARE @CurrentFileName nvarchar(max)
435 DECLARE @CurrentDirectoryID int
436 DECLARE @CurrentDirectoryPath nvarchar(max)
437 DECLARE @CurrentFilePath nvarchar(max)
438 DECLARE @CurrentDate datetime
439 DECLARE @CurrentCleanupDate datetime
440 DECLARE @CurrentIsDatabaseAccessible bit
441 DECLARE @CurrentAvailabilityGroup nvarchar(max)
442 DECLARE @CurrentAvailabilityGroupRole nvarchar(max)
443 DECLARE @CurrentAvailabilityGroupBackupPreference nvarchar(max)
444 DECLARE @CurrentIsPreferredBackupReplica bit
445 DECLARE @CurrentDatabaseMirroringRole nvarchar(max)
446 DECLARE @CurrentLogShippingRole nvarchar(max)
447 DECLARE @CurrentIsEncrypted bit
448 DECLARE @CurrentIsReadOnly bit
449 DECLARE @CurrentBackupSetID int
450 DECLARE @CurrentIsMirror bit
451 DECLARE @CurrentLastLogBackup datetime
452 DECLARE @CurrentLogSizeSinceLastLogBackup float
453 DECLARE @CurrentAllocatedExtentPageCount bigint
454 DECLARE @CurrentModifiedExtentPageCount bigint
455
456 DECLARE @CurrentCommand01 nvarchar(max)
457 DECLARE @CurrentCommand02 nvarchar(max)
458 DECLARE @CurrentCommand03 nvarchar(max)
459 DECLARE @CurrentCommand04 nvarchar(max)
460 DECLARE @CurrentCommand05 nvarchar(max)
461 DECLARE @CurrentCommand06 nvarchar(max)
462 DECLARE @CurrentCommand07 nvarchar(max)
463
464 DECLARE @CurrentCommandOutput01 int
465 DECLARE @CurrentCommandOutput02 int
466 DECLARE @CurrentCommandOutput03 int
467 DECLARE @CurrentCommandOutput04 int
468 DECLARE @CurrentCommandOutput05 int
469
470 DECLARE @CurrentCommandType01 nvarchar(max)
471 DECLARE @CurrentCommandType02 nvarchar(max)
472 DECLARE @CurrentCommandType03 nvarchar(max)
473 DECLARE @CurrentCommandType04 nvarchar(max)
474 DECLARE @CurrentCommandType05 nvarchar(max)
475
476 DECLARE @Directories TABLE (ID int PRIMARY KEY,
477 DirectoryPath nvarchar(max),
478 Mirror bit,
479 Completed bit)
480
481 DECLARE @URLs TABLE (ID int IDENTITY PRIMARY KEY,
482 DirectoryPath nvarchar(max),
483 Mirror bit)
484
485 DECLARE @DirectoryInfo TABLE (FileExists bit,
486 FileIsADirectory bit,
487 ParentDirectoryExists bit)
488
489 DECLARE @tmpDatabases TABLE (ID int IDENTITY,
490 DatabaseName nvarchar(max),
491 DatabaseNameFS nvarchar(max),
492 DatabaseType nvarchar(max),
493 AvailabilityGroup bit,
494 StartPosition int,
495 DatabaseSize bigint,
496 LogSizeSinceLastLogBackup float,
497 [Order] int,
498 Selected bit,
499 Completed bit,
500 PRIMARY KEY(Selected, Completed, [Order], ID))
501
502 DECLARE @tmpAvailabilityGroups TABLE (ID int IDENTITY PRIMARY KEY,
503 AvailabilityGroupName nvarchar(max),
504 StartPosition int,
505 Selected bit)
506
507 DECLARE @tmpDatabasesAvailabilityGroups TABLE (DatabaseName nvarchar(max),
508 AvailabilityGroupName nvarchar(max))
509
510 DECLARE @SelectedDatabases TABLE (DatabaseName nvarchar(max),
511 DatabaseType nvarchar(max),
512 AvailabilityGroup nvarchar(max),
513 StartPosition int,
514 Selected bit)
515
516 DECLARE @SelectedAvailabilityGroups TABLE (AvailabilityGroupName nvarchar(max),
517 StartPosition int,
518 Selected bit)
519
520 DECLARE @CurrentBackupSet TABLE (ID int IDENTITY PRIMARY KEY,
521 Mirror bit,
522 VerifyCompleted bit,
523 VerifyOutput int)
524
525 DECLARE @CurrentDirectories TABLE (ID int PRIMARY KEY,
526 DirectoryPath nvarchar(max),
527 Mirror bit,
528 DirectoryNumber int,
529 CleanupDate datetime,
530 CleanupMode nvarchar(max),
531 CreateCompleted bit,
532 CleanupCompleted bit,
533 CreateOutput int,
534 CleanupOutput int)
535
536 DECLARE @CurrentURLs TABLE (ID int PRIMARY KEY,
537 DirectoryPath nvarchar(max),
538 Mirror bit)
539
540 DECLARE @CurrentFiles TABLE ([Type] nvarchar(max),
541 FilePath nvarchar(max),
542 Mirror bit)
543
544 DECLARE @CurrentCleanupDates TABLE (CleanupDate datetime, Mirror bit)
545
546 DECLARE @DirectoryCheck bit
547
548 DECLARE @Error int
549 DECLARE @ReturnCode int
550
551 SET @Error = 0
552 SET @ReturnCode = 0
553
554 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))
555
556 IF @Version >= 14
557 BEGIN
558 SELECT @HostPlatform = host_platform
559 FROM sys.dm_os_host_info
560 END
561 ELSE
562 BEGIN
563 SET @HostPlatform = 'Windows'
564 END
565
566 SET @AmazonRDS = CASE WHEN DB_ID('rdsadmin') IS NOT NULL AND SUSER_SNAME(0x01) = 'rdsa' THEN 1 ELSE 0 END
567
568 ----------------------------------------------------------------------------------------------------
569 --// Log initial information //--
570 ----------------------------------------------------------------------------------------------------
571
572 SET @StartTime = GETDATE()
573 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)
574 SET @ObjectName = OBJECT_NAME(@@PROCID)
575 SET @VersionTimestamp = SUBSTRING(OBJECT_DEFINITION(@@PROCID),CHARINDEX('--// Version: ',OBJECT_DEFINITION(@@PROCID)) + LEN('--// Version: ') + 1, 19)
576
577 SET @Parameters = '@Databases = ' + ISNULL('''' + REPLACE(@Databases,'''','''''') + '''','NULL')
578 SET @Parameters = @Parameters + ', @Directory = ' + ISNULL('''' + REPLACE(@Directory,'''','''''') + '''','NULL')
579 SET @Parameters = @Parameters + ', @BackupType = ' + ISNULL('''' + REPLACE(@BackupType,'''','''''') + '''','NULL')
580 SET @Parameters = @Parameters + ', @Verify = ' + ISNULL('''' + REPLACE(@Verify,'''','''''') + '''','NULL')
581 SET @Parameters = @Parameters + ', @CleanupTime = ' + ISNULL(CAST(@CleanupTime AS nvarchar),'NULL')
582 SET @Parameters = @Parameters + ', @CleanupMode = ' + ISNULL('''' + REPLACE(@CleanupMode,'''','''''') + '''','NULL')
583 SET @Parameters = @Parameters + ', @Compress = ' + ISNULL('''' + REPLACE(@Compress,'''','''''') + '''','NULL')
584 SET @Parameters = @Parameters + ', @CopyOnly = ' + ISNULL('''' + REPLACE(@CopyOnly,'''','''''') + '''','NULL')
585 SET @Parameters = @Parameters + ', @ChangeBackupType = ' + ISNULL('''' + REPLACE(@ChangeBackupType,'''','''''') + '''','NULL')
586 SET @Parameters = @Parameters + ', @BackupSoftware = ' + ISNULL('''' + REPLACE(@BackupSoftware,'''','''''') + '''','NULL')
587 SET @Parameters = @Parameters + ', @CheckSum = ' + ISNULL('''' + REPLACE(@CheckSum,'''','''''') + '''','NULL')
588 SET @Parameters = @Parameters + ', @BlockSize = ' + ISNULL(CAST(@BlockSize AS nvarchar),'NULL')
589 SET @Parameters = @Parameters + ', @BufferCount = ' + ISNULL(CAST(@BufferCount AS nvarchar),'NULL')
590 SET @Parameters = @Parameters + ', @MaxTransferSize = ' + ISNULL(CAST(@MaxTransferSize AS nvarchar),'NULL')
591 SET @Parameters = @Parameters + ', @NumberOfFiles = ' + ISNULL(CAST(@NumberOfFiles AS nvarchar),'NULL')
592 SET @Parameters = @Parameters + ', @CompressionLevel = ' + ISNULL(CAST(@CompressionLevel AS nvarchar),'NULL')
593 SET @Parameters = @Parameters + ', @Description = ' + ISNULL('''' + REPLACE(@Description,'''','''''') + '''','NULL')
594 SET @Parameters = @Parameters + ', @Threads = ' + ISNULL(CAST(@Threads AS nvarchar),'NULL')
595 SET @Parameters = @Parameters + ', @Throttle = ' + ISNULL(CAST(@Throttle AS nvarchar),'NULL')
596 SET @Parameters = @Parameters + ', @Encrypt = ' + ISNULL('''' + REPLACE(@Encrypt,'''','''''') + '''','NULL')
597 SET @Parameters = @Parameters + ', @EncryptionAlgorithm = ' + ISNULL('''' + REPLACE(@EncryptionAlgorithm,'''','''''') + '''','NULL')
598 SET @Parameters = @Parameters + ', @ServerCertificate = ' + ISNULL('''' + REPLACE(@ServerCertificate,'''','''''') + '''','NULL')
599 SET @Parameters = @Parameters + ', @ServerAsymmetricKey = ' + ISNULL('''' + REPLACE(@ServerAsymmetricKey,'''','''''') + '''','NULL')
600 SET @Parameters = @Parameters + ', @EncryptionKey = ' + ISNULL('''' + REPLACE(@EncryptionKey,'''','''''') + '''','NULL')
601 SET @Parameters = @Parameters + ', @ReadWriteFileGroups = ' + ISNULL('''' + REPLACE(@ReadWriteFileGroups,'''','''''') + '''','NULL')
602 SET @Parameters = @Parameters + ', @OverrideBackupPreference = ' + ISNULL('''' + REPLACE(@OverrideBackupPreference,'''','''''') + '''','NULL')
603 SET @Parameters = @Parameters + ', @NoRecovery = ' + ISNULL('''' + REPLACE(@NoRecovery,'''','''''') + '''','NULL')
604 SET @Parameters = @Parameters + ', @URL = ' + ISNULL('''' + REPLACE(@URL,'''','''''') + '''','NULL')
605 SET @Parameters = @Parameters + ', @Credential = ' + ISNULL('''' + REPLACE(@Credential,'''','''''') + '''','NULL')
606 SET @Parameters = @Parameters + ', @MirrorDirectory = ' + ISNULL('''' + REPLACE(@MirrorDirectory,'''','''''') + '''','NULL')
607 SET @Parameters = @Parameters + ', @MirrorCleanupTime = ' + ISNULL(CAST(@MirrorCleanupTime AS nvarchar),'NULL')
608 SET @Parameters = @Parameters + ', @MirrorCleanupMode = ' + ISNULL('''' + REPLACE(@MirrorCleanupMode,'''','''''') + '''','NULL')
609 SET @Parameters = @Parameters + ', @MirrorURL = ' + ISNULL('''' + REPLACE(@MirrorURL,'''','''''') + '''','NULL')
610 SET @Parameters = @Parameters + ', @AvailabilityGroups = ' + ISNULL('''' + REPLACE(@AvailabilityGroups,'''','''''') + '''','NULL')
611 SET @Parameters = @Parameters + ', @Updateability = ' + ISNULL('''' + REPLACE(@Updateability,'''','''''') + '''','NULL')
612 SET @Parameters = @Parameters + ', @AdaptiveCompression = ' + ISNULL('''' + REPLACE(@AdaptiveCompression,'''','''''') + '''','NULL')
613 SET @Parameters = @Parameters + ', @ModificationLevel = ' + ISNULL(CAST(@ModificationLevel AS nvarchar),'NULL')
614 SET @Parameters = @Parameters + ', @LogSizeSinceLastLogBackup = ' + ISNULL(CAST(@LogSizeSinceLastLogBackup AS nvarchar),'NULL')
615 SET @Parameters = @Parameters + ', @TimeSinceLastLogBackup = ' + ISNULL(CAST(@TimeSinceLastLogBackup AS nvarchar),'NULL')
616 SET @Parameters = @Parameters + ', @DataDomainBoostHost = ' + ISNULL('''' + REPLACE(@DataDomainBoostHost,'''','''''') + '''','NULL')
617 SET @Parameters = @Parameters + ', @DataDomainBoostUser = ' + ISNULL('''' + REPLACE(@DataDomainBoostUser,'''','''''') + '''','NULL')
618 SET @Parameters = @Parameters + ', @DataDomainBoostDevicePath = ' + ISNULL('''' + REPLACE(@DataDomainBoostDevicePath,'''','''''') + '''','NULL')
619 SET @Parameters = @Parameters + ', @DataDomainBoostLockboxPath = ' + ISNULL('''' + REPLACE(@DataDomainBoostLockboxPath,'''','''''') + '''','NULL')
620 SET @Parameters = @Parameters + ', @DirectoryStructure = ' + ISNULL('''' + REPLACE(@DirectoryStructure,'''','''''') + '''','NULL')
621 SET @Parameters = @Parameters + ', @AvailabilityGroupDirectoryStructure = ' + ISNULL('''' + REPLACE(@AvailabilityGroupDirectoryStructure,'''','''''') + '''','NULL')
622 SET @Parameters = @Parameters + ', @FileName = ' + ISNULL('''' + REPLACE(@FileName,'''','''''') + '''','NULL')
623 SET @Parameters = @Parameters + ', @AvailabilityGroupFileName = ' + ISNULL('''' + REPLACE(@AvailabilityGroupFileName,'''','''''') + '''','NULL')
624 SET @Parameters = @Parameters + ', @FileExtensionFull = ' + ISNULL('''' + REPLACE(@FileExtensionFull,'''','''''') + '''','NULL')
625 SET @Parameters = @Parameters + ', @FileExtensionDiff = ' + ISNULL('''' + REPLACE(@FileExtensionDiff,'''','''''') + '''','NULL')
626 SET @Parameters = @Parameters + ', @FileExtensionLog = ' + ISNULL('''' + REPLACE(@FileExtensionLog,'''','''''') + '''','NULL')
627 SET @Parameters = @Parameters + ', @Init = ' + ISNULL('''' + REPLACE(@Init,'''','''''') + '''','NULL')
628 SET @Parameters = @Parameters + ', @DatabaseOrder = ' + ISNULL('''' + REPLACE(@DatabaseOrder,'''','''''') + '''','NULL')
629 SET @Parameters = @Parameters + ', @DatabasesInParallel = ' + ISNULL('''' + REPLACE(@DatabasesInParallel,'''','''''') + '''','NULL')
630 SET @Parameters = @Parameters + ', @LogToTable = ' + ISNULL('''' + REPLACE(@LogToTable,'''','''''') + '''','NULL')
631 SET @Parameters = @Parameters + ', @Execute = ' + ISNULL('''' + REPLACE(@Execute,'''','''''') + '''','NULL')
632
633 SET @StartMessage = 'Date and time: ' + CONVERT(nvarchar,@StartTime,120)
634 RAISERROR(@StartMessage,10,1) WITH NOWAIT
635
636 SET @StartMessage = 'Server: ' + CAST(SERVERPROPERTY('ServerName') AS nvarchar(max))
637 RAISERROR(@StartMessage,10,1) WITH NOWAIT
638
639 SET @StartMessage = 'Version: ' + CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max))
640 RAISERROR(@StartMessage,10,1) WITH NOWAIT
641
642 SET @StartMessage = 'Edition: ' + CAST(SERVERPROPERTY('Edition') AS nvarchar(max))
643 RAISERROR(@StartMessage,10,1) WITH NOWAIT
644
645 SET @StartMessage = 'Platform: ' + @HostPlatform
646 RAISERROR(@StartMessage,10,1) WITH NOWAIT
647
648 SET @StartMessage = 'Procedure: ' + QUOTENAME(DB_NAME(DB_ID())) + '.' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(@ObjectName)
649 RAISERROR(@StartMessage,10,1) WITH NOWAIT
650
651 SET @StartMessage = 'Parameters: ' + @Parameters
652 SET @StartMessage = REPLACE(@StartMessage,'%','%%')
653 RAISERROR(@StartMessage,10,1) WITH NOWAIT
654
655 SET @StartMessage = 'Version: ' + @VersionTimestamp
656 RAISERROR(@StartMessage,10,1) WITH NOWAIT
657
658 SET @StartMessage = 'Source: https://FixSQL.co.uk' + CHAR(13) + CHAR(10) + ' '
659 RAISERROR(@StartMessage,10,1) WITH NOWAIT
660
661 ----------------------------------------------------------------------------------------------------
662 --// Check core requirements //--
663 ----------------------------------------------------------------------------------------------------
664
665 IF NOT (SELECT [compatibility_level] FROM sys.databases WHERE database_id = DB_ID()) >= 90
666 BEGIN
667 SET @ErrorMessage = 'The database ' + QUOTENAME(DB_NAME(DB_ID())) + ' has to be in compatibility level 90 or higher.' + CHAR(13) + CHAR(10) + ' '
668 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
669 SET @Error = @@ERROR
670 END
671
672 IF NOT (SELECT uses_ansi_nulls FROM sys.sql_modules WHERE [object_id] = @@PROCID) = 1
673 BEGIN
674 SET @ErrorMessage = 'ANSI_NULLS has to be set to ON for the stored procedure.' + CHAR(13) + CHAR(10) + ' '
675 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
676 SET @Error = @@ERROR
677 END
678
679 IF NOT (SELECT uses_quoted_identifier FROM sys.sql_modules WHERE [object_id] = @@PROCID) = 1
680 BEGIN
681 SET @ErrorMessage = 'QUOTED_IDENTIFIER has to be set to ON for the stored procedure.' + CHAR(13) + CHAR(10) + ' '
682 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
683 SET @Error = @@ERROR
684 END
685
686 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')
687 BEGIN
688 SET @ErrorMessage = 'The stored procedure CommandExecute is missing. Download https://FixSQL.co.uk/scripts/CommandExecute.sql.' + CHAR(13) + CHAR(10) + ' '
689 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
690 SET @Error = @@ERROR
691 END
692
693 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%')
694 BEGIN
695 SET @ErrorMessage = 'The stored procedure CommandExecute needs to be updated. Download https://FixSQL.co.uk/scripts/CommandExecute.sql.' + CHAR(13) + CHAR(10) + ' '
696 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
697 SET @Error = @@ERROR
698 END
699
700 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')
701 BEGIN
702 SET @ErrorMessage = 'The table CommandLog is missing. Download https://FixSQL.co.uk/scripts/CommandLog.sql.' + CHAR(13) + CHAR(10) + ' '
703 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
704 SET @Error = @@ERROR
705 END
706
707 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')
708 BEGIN
709 SET @ErrorMessage = 'The table Queue is missing. Download https://FixSQL.co.uk/scripts/Queue.sql.' + CHAR(13) + CHAR(10) + ' '
710 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
711 SET @Error = @@ERROR
712 END
713
714 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')
715 BEGIN
716 SET @ErrorMessage = 'The table QueueDatabase is missing. Download https://FixSQL.co.uk/scripts/QueueDatabase.sql.' + CHAR(13) + CHAR(10) + ' '
717 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
718 SET @Error = @@ERROR
719 END
720
721 IF @@TRANCOUNT <> 0
722 BEGIN
723 SET @ErrorMessage = 'The transaction count is not 0.' + CHAR(13) + CHAR(10) + ' '
724 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
725 SET @Error = @@ERROR
726 END
727
728 IF @AmazonRDS = 1
729 BEGIN
730 SET @ErrorMessage = 'The stored procedure DatabaseBackup is not supported on Amazon RDS.' + CHAR(13) + CHAR(10) + ' '
731 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
732 SET @Error = @@ERROR
733 END
734
735 IF @Error <> 0
736 BEGIN
737 SET @ReturnCode = @Error
738 GOTO Logging
739 END
740
741 ----------------------------------------------------------------------------------------------------
742 --// Select databases //--
743 ----------------------------------------------------------------------------------------------------
744
745 SET @Databases = REPLACE(@Databases, CHAR(10), '')
746 SET @Databases = REPLACE(@Databases, CHAR(13), '')
747
748 WHILE CHARINDEX(', ',@Databases) > 0 SET @Databases = REPLACE(@Databases,', ',',')
749 WHILE CHARINDEX(' ,',@Databases) > 0 SET @Databases = REPLACE(@Databases,' ,',',')
750
751 SET @Databases = LTRIM(RTRIM(@Databases));
752
753 WITH Databases1 (StartPosition, EndPosition, DatabaseItem) AS
754 (
755 SELECT 1 AS StartPosition,
756 ISNULL(NULLIF(CHARINDEX(',', @Databases, 1), 0), LEN(@Databases) + 1) AS EndPosition,
757 SUBSTRING(@Databases, 1, ISNULL(NULLIF(CHARINDEX(',', @Databases, 1), 0), LEN(@Databases) + 1) - 1) AS DatabaseItem
758 WHERE @Databases IS NOT NULL
759 UNION ALL
760 SELECT CAST(EndPosition AS int) + 1 AS StartPosition,
761 ISNULL(NULLIF(CHARINDEX(',', @Databases, EndPosition + 1), 0), LEN(@Databases) + 1) AS EndPosition,
762 SUBSTRING(@Databases, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(',', @Databases, EndPosition + 1), 0), LEN(@Databases) + 1) - EndPosition - 1) AS DatabaseItem
763 FROM Databases1
764 WHERE EndPosition < LEN(@Databases) + 1
765 ),
766 Databases2 (DatabaseItem, StartPosition, Selected) AS
767 (
768 SELECT CASE WHEN DatabaseItem LIKE '-%' THEN RIGHT(DatabaseItem,LEN(DatabaseItem) - 1) ELSE DatabaseItem END AS DatabaseItem,
769 StartPosition,
770 CASE WHEN DatabaseItem LIKE '-%' THEN 0 ELSE 1 END AS Selected
771 FROM Databases1
772 ),
773 Databases3 (DatabaseItem, DatabaseType, AvailabilityGroup, StartPosition, Selected) AS
774 (
775 SELECT CASE WHEN DatabaseItem IN('ALL_DATABASES','SYSTEM_DATABASES','USER_DATABASES','AVAILABILITY_GROUP_DATABASES') THEN '%' ELSE DatabaseItem END AS DatabaseItem,
776 CASE WHEN DatabaseItem = 'SYSTEM_DATABASES' THEN 'S' WHEN DatabaseItem = 'USER_DATABASES' THEN 'U' ELSE NULL END AS DatabaseType,
777 CASE WHEN DatabaseItem = 'AVAILABILITY_GROUP_DATABASES' THEN 1 ELSE NULL END AvailabilityGroup,
778 StartPosition,
779 Selected
780 FROM Databases2
781 ),
782 Databases4 (DatabaseName, DatabaseType, AvailabilityGroup, StartPosition, Selected) AS
783 (
784 SELECT CASE WHEN LEFT(DatabaseItem,1) = '[' AND RIGHT(DatabaseItem,1) = ']' THEN PARSENAME(DatabaseItem,1) ELSE DatabaseItem END AS DatabaseItem,
785 DatabaseType,
786 AvailabilityGroup,
787 StartPosition,
788 Selected
789 FROM Databases3
790 )
791 INSERT INTO @SelectedDatabases (DatabaseName, DatabaseType, AvailabilityGroup, StartPosition, Selected)
792 SELECT DatabaseName,
793 DatabaseType,
794 AvailabilityGroup,
795 StartPosition,
796 Selected
797 FROM Databases4
798 OPTION (MAXRECURSION 0)
799
800 IF @Version >= 11 AND SERVERPROPERTY('IsHadrEnabled') = 1
801 BEGIN
802 INSERT INTO @tmpAvailabilityGroups (AvailabilityGroupName, Selected)
803 SELECT name AS AvailabilityGroupName,
804 0 AS Selected
805 FROM sys.availability_groups
806
807 INSERT INTO @tmpDatabasesAvailabilityGroups (DatabaseName, AvailabilityGroupName)
808 SELECT availability_databases_cluster.database_name, availability_groups.name
809 FROM sys.availability_databases_cluster availability_databases_cluster
810 INNER JOIN sys.availability_groups availability_groups ON availability_databases_cluster.group_id = availability_groups.group_id
811 END
812
813 INSERT INTO @tmpDatabases (DatabaseName, DatabaseNameFS, DatabaseType, AvailabilityGroup, [Order], Selected, Completed)
814 SELECT [name] AS DatabaseName,
815 LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE([name],'\',''),'/',''),':',''),'*',''),'?',''),'"',''),'<',''),'>',''),'|',''))) AS DatabaseNameFS,
816 CASE WHEN name IN('master','msdb','model') THEN 'S' ELSE 'U' END AS DatabaseType,
817 NULL AS AvailabilityGroup,
818 0 AS [Order],
819 0 AS Selected,
820 0 AS Completed
821 FROM sys.databases
822 WHERE [name] <> 'tempdb'
823 AND source_database_id IS NULL
824 ORDER BY [name] ASC
825
826 UPDATE tmpDatabases
827 SET AvailabilityGroup = CASE WHEN EXISTS (SELECT * FROM @tmpDatabasesAvailabilityGroups WHERE DatabaseName = tmpDatabases.DatabaseName) THEN 1 ELSE 0 END
828 FROM @tmpDatabases tmpDatabases
829
830 UPDATE tmpDatabases
831 SET tmpDatabases.Selected = SelectedDatabases.Selected
832 FROM @tmpDatabases tmpDatabases
833 INNER JOIN @SelectedDatabases SelectedDatabases
834 ON tmpDatabases.DatabaseName LIKE REPLACE(SelectedDatabases.DatabaseName,'_','[_]')
835 AND (tmpDatabases.DatabaseType = SelectedDatabases.DatabaseType OR SelectedDatabases.DatabaseType IS NULL)
836 AND (tmpDatabases.AvailabilityGroup = SelectedDatabases.AvailabilityGroup OR SelectedDatabases.AvailabilityGroup IS NULL)
837 WHERE SelectedDatabases.Selected = 1
838
839 UPDATE tmpDatabases
840 SET tmpDatabases.Selected = SelectedDatabases.Selected
841 FROM @tmpDatabases tmpDatabases
842 INNER JOIN @SelectedDatabases SelectedDatabases
843 ON tmpDatabases.DatabaseName LIKE REPLACE(SelectedDatabases.DatabaseName,'_','[_]')
844 AND (tmpDatabases.DatabaseType = SelectedDatabases.DatabaseType OR SelectedDatabases.DatabaseType IS NULL)
845 AND (tmpDatabases.AvailabilityGroup = SelectedDatabases.AvailabilityGroup OR SelectedDatabases.AvailabilityGroup IS NULL)
846 WHERE SelectedDatabases.Selected = 0
847
848 UPDATE tmpDatabases
849 SET tmpDatabases.StartPosition = SelectedDatabases2.StartPosition
850 FROM @tmpDatabases tmpDatabases
851 INNER JOIN (SELECT tmpDatabases.DatabaseName, MIN(SelectedDatabases.StartPosition) AS StartPosition
852 FROM @tmpDatabases tmpDatabases
853 INNER JOIN @SelectedDatabases SelectedDatabases
854 ON tmpDatabases.DatabaseName LIKE REPLACE(SelectedDatabases.DatabaseName,'_','[_]')
855 AND (tmpDatabases.DatabaseType = SelectedDatabases.DatabaseType OR SelectedDatabases.DatabaseType IS NULL)
856 AND (tmpDatabases.AvailabilityGroup = SelectedDatabases.AvailabilityGroup OR SelectedDatabases.AvailabilityGroup IS NULL)
857 WHERE SelectedDatabases.Selected = 1
858 GROUP BY tmpDatabases.DatabaseName) SelectedDatabases2
859 ON tmpDatabases.DatabaseName = SelectedDatabases2.DatabaseName
860
861 IF @Databases IS NOT NULL AND (NOT EXISTS(SELECT * FROM @SelectedDatabases) OR EXISTS(SELECT * FROM @SelectedDatabases WHERE DatabaseName IS NULL OR DatabaseName = ''))
862 BEGIN
863 SET @ErrorMessage = 'The value for the parameter @Databases is not supported.' + CHAR(13) + CHAR(10) + ' '
864 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
865 SET @Error = @@ERROR
866 END
867
868 ----------------------------------------------------------------------------------------------------
869 --// Select availability groups //--
870 ----------------------------------------------------------------------------------------------------
871
872 IF @AvailabilityGroups IS NOT NULL AND @Version >= 11 AND SERVERPROPERTY('IsHadrEnabled') = 1
873 BEGIN
874
875 SET @AvailabilityGroups = REPLACE(@AvailabilityGroups, CHAR(10), '')
876 SET @AvailabilityGroups = REPLACE(@AvailabilityGroups, CHAR(13), '')
877
878 WHILE CHARINDEX(', ',@AvailabilityGroups) > 0 SET @AvailabilityGroups = REPLACE(@AvailabilityGroups,', ',',')
879 WHILE CHARINDEX(' ,',@AvailabilityGroups) > 0 SET @AvailabilityGroups = REPLACE(@AvailabilityGroups,' ,',',')
880
881 SET @AvailabilityGroups = LTRIM(RTRIM(@AvailabilityGroups));
882
883 WITH AvailabilityGroups1 (StartPosition, EndPosition, AvailabilityGroupItem) AS
884 (
885 SELECT 1 AS StartPosition,
886 ISNULL(NULLIF(CHARINDEX(',', @AvailabilityGroups, 1), 0), LEN(@AvailabilityGroups) + 1) AS EndPosition,
887 SUBSTRING(@AvailabilityGroups, 1, ISNULL(NULLIF(CHARINDEX(',', @AvailabilityGroups, 1), 0), LEN(@AvailabilityGroups) + 1) - 1) AS AvailabilityGroupItem
888 WHERE @AvailabilityGroups IS NOT NULL
889 UNION ALL
890 SELECT CAST(EndPosition AS int) + 1 AS StartPosition,
891 ISNULL(NULLIF(CHARINDEX(',', @AvailabilityGroups, EndPosition + 1), 0), LEN(@AvailabilityGroups) + 1) AS EndPosition,
892 SUBSTRING(@AvailabilityGroups, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(',', @AvailabilityGroups, EndPosition + 1), 0), LEN(@AvailabilityGroups) + 1) - EndPosition - 1) AS AvailabilityGroupItem
893 FROM AvailabilityGroups1
894 WHERE EndPosition < LEN(@AvailabilityGroups) + 1
895 ),
896 AvailabilityGroups2 (AvailabilityGroupItem, StartPosition, Selected) AS
897 (
898 SELECT CASE WHEN AvailabilityGroupItem LIKE '-%' THEN RIGHT(AvailabilityGroupItem,LEN(AvailabilityGroupItem) - 1) ELSE AvailabilityGroupItem END AS AvailabilityGroupItem,
899 StartPosition,
900 CASE WHEN AvailabilityGroupItem LIKE '-%' THEN 0 ELSE 1 END AS Selected
901 FROM AvailabilityGroups1
902 ),
903 AvailabilityGroups3 (AvailabilityGroupItem, StartPosition, Selected) AS
904 (
905 SELECT CASE WHEN AvailabilityGroupItem = 'ALL_AVAILABILITY_GROUPS' THEN '%' ELSE AvailabilityGroupItem END AS AvailabilityGroupItem,
906 StartPosition,
907 Selected
908 FROM AvailabilityGroups2
909 ),
910 AvailabilityGroups4 (AvailabilityGroupName, StartPosition, Selected) AS
911 (
912 SELECT CASE WHEN LEFT(AvailabilityGroupItem,1) = '[' AND RIGHT(AvailabilityGroupItem,1) = ']' THEN PARSENAME(AvailabilityGroupItem,1) ELSE AvailabilityGroupItem END AS AvailabilityGroupItem,
913 StartPosition,
914 Selected
915 FROM AvailabilityGroups3
916 )
917 INSERT INTO @SelectedAvailabilityGroups (AvailabilityGroupName, StartPosition, Selected)
918 SELECT AvailabilityGroupName, StartPosition, Selected
919 FROM AvailabilityGroups4
920 OPTION (MAXRECURSION 0)
921
922 UPDATE tmpAvailabilityGroups
923 SET tmpAvailabilityGroups.Selected = SelectedAvailabilityGroups.Selected
924 FROM @tmpAvailabilityGroups tmpAvailabilityGroups
925 INNER JOIN @SelectedAvailabilityGroups SelectedAvailabilityGroups
926 ON tmpAvailabilityGroups.AvailabilityGroupName LIKE REPLACE(SelectedAvailabilityGroups.AvailabilityGroupName,'_','[_]')
927 WHERE SelectedAvailabilityGroups.Selected = 1
928
929 UPDATE tmpAvailabilityGroups
930 SET tmpAvailabilityGroups.Selected = SelectedAvailabilityGroups.Selected
931 FROM @tmpAvailabilityGroups tmpAvailabilityGroups
932 INNER JOIN @SelectedAvailabilityGroups SelectedAvailabilityGroups
933 ON tmpAvailabilityGroups.AvailabilityGroupName LIKE REPLACE(SelectedAvailabilityGroups.AvailabilityGroupName,'_','[_]')
934 WHERE SelectedAvailabilityGroups.Selected = 0
935
936 UPDATE tmpAvailabilityGroups
937 SET tmpAvailabilityGroups.StartPosition = SelectedAvailabilityGroups2.StartPosition
938 FROM @tmpAvailabilityGroups tmpAvailabilityGroups
939 INNER JOIN (SELECT tmpAvailabilityGroups.AvailabilityGroupName, MIN(SelectedAvailabilityGroups.StartPosition) AS StartPosition
940 FROM @tmpAvailabilityGroups tmpAvailabilityGroups
941 INNER JOIN @SelectedAvailabilityGroups SelectedAvailabilityGroups
942 ON tmpAvailabilityGroups.AvailabilityGroupName LIKE REPLACE(SelectedAvailabilityGroups.AvailabilityGroupName,'_','[_]')
943 WHERE SelectedAvailabilityGroups.Selected = 1
944 GROUP BY tmpAvailabilityGroups.AvailabilityGroupName) SelectedAvailabilityGroups2
945 ON tmpAvailabilityGroups.AvailabilityGroupName = SelectedAvailabilityGroups2.AvailabilityGroupName
946
947 UPDATE tmpDatabases
948 SET tmpDatabases.StartPosition = tmpAvailabilityGroups.StartPosition,
949 tmpDatabases.Selected = 1
950 FROM @tmpDatabases tmpDatabases
951 INNER JOIN @tmpDatabasesAvailabilityGroups tmpDatabasesAvailabilityGroups ON tmpDatabases.DatabaseName = tmpDatabasesAvailabilityGroups.DatabaseName
952 INNER JOIN @tmpAvailabilityGroups tmpAvailabilityGroups ON tmpDatabasesAvailabilityGroups.AvailabilityGroupName = tmpAvailabilityGroups.AvailabilityGroupName
953 WHERE tmpAvailabilityGroups.Selected = 1
954
955 END
956
957 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)
958 BEGIN
959 SET @ErrorMessage = 'The value for the parameter @AvailabilityGroups is not supported.' + CHAR(13) + CHAR(10) + ' '
960 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
961 SET @Error = @@ERROR
962 END
963
964 IF (@Databases IS NULL AND @AvailabilityGroups IS NULL)
965 BEGIN
966 SET @ErrorMessage = 'You need to specify one of the parameters @Databases and @AvailabilityGroups.' + CHAR(13) + CHAR(10) + ' '
967 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
968 SET @Error = @@ERROR
969 END
970
971 IF (@Databases IS NOT NULL AND @AvailabilityGroups IS NOT NULL)
972 BEGIN
973 SET @ErrorMessage = 'You can only specify one of the parameters @Databases and @AvailabilityGroups.' + CHAR(13) + CHAR(10) + ' '
974 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
975 SET @Error = @@ERROR
976 END
977
978 ----------------------------------------------------------------------------------------------------
979 --// Check database names //--
980 ----------------------------------------------------------------------------------------------------
981
982 SET @ErrorMessage = ''
983 SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + ', '
984 FROM @tmpDatabases
985 WHERE Selected = 1
986 AND DatabaseNameFS = ''
987 ORDER BY DatabaseName ASC
988 IF @@ROWCOUNT > 0
989 BEGIN
990 SET @ErrorMessage = 'The names of the following databases are not supported: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.' + CHAR(13) + CHAR(10) + ' '
991 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
992 SET @Error = @@ERROR
993 END
994
995 SET @ErrorMessage = ''
996 SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + ', '
997 FROM @tmpDatabases
998 WHERE UPPER(DatabaseNameFS) IN(SELECT UPPER(DatabaseNameFS) FROM @tmpDatabases GROUP BY UPPER(DatabaseNameFS) HAVING COUNT(*) > 1)
999 AND UPPER(DatabaseNameFS) IN(SELECT UPPER(DatabaseNameFS) FROM @tmpDatabases WHERE Selected = 1)
1000 AND DatabaseNameFS <> ''
1001 ORDER BY DatabaseName ASC
1002 OPTION (RECOMPILE)
1003 IF @@ROWCOUNT > 0
1004 BEGIN
1005 SET @ErrorMessage = 'The names of the following databases are not unique in the file system: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.' + CHAR(13) + CHAR(10) + ' '
1006 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1007 SET @Error = @@ERROR
1008 END
1009
1010 ----------------------------------------------------------------------------------------------------
1011 --// Select directories //--
1012 ----------------------------------------------------------------------------------------------------
1013
1014 IF @Directory IS NULL AND @URL IS NULL AND @HostPlatform = 'Windows' AND (@BackupSoftware <> 'DATA_DOMAIN_BOOST' OR @BackupSoftware IS NULL)
1015 BEGIN
1016 EXECUTE [master].dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'SOFTWARE\Microsoft\MSSQLServer\MSSQLServer', N'BackupDirectory', @DefaultDirectory OUTPUT
1017
1018 IF @DefaultDirectory LIKE 'http://%' OR @DefaultDirectory LIKE 'https://%'
1019 BEGIN
1020 SET @URL = @DefaultDirectory
1021 END
1022 ELSE
1023 BEGIN
1024 INSERT INTO @Directories (ID, DirectoryPath, Mirror, Completed)
1025 SELECT 1, @DefaultDirectory, 0, 0
1026 END
1027 END
1028 IF @Directory IS NULL AND @URL IS NULL AND @HostPlatform = 'Linux'
1029 BEGIN
1030 INSERT INTO @Directories (ID, DirectoryPath, Mirror, Completed)
1031 SELECT 1, '.', 0, 0
1032 END
1033 ELSE
1034 BEGIN
1035 SET @Directory = REPLACE(@Directory, CHAR(10), '')
1036 SET @Directory = REPLACE(@Directory, CHAR(13), '')
1037
1038 WHILE CHARINDEX(', ',@Directory) > 0 SET @Directory = REPLACE(@Directory,', ',',')
1039 WHILE CHARINDEX(' ,',@Directory) > 0 SET @Directory = REPLACE(@Directory,' ,',',')
1040
1041 SET @Directory = LTRIM(RTRIM(@Directory));
1042
1043 WITH Directories (StartPosition, EndPosition, Directory) AS
1044 (
1045 SELECT 1 AS StartPosition,
1046 ISNULL(NULLIF(CHARINDEX(',', @Directory, 1), 0), LEN(@Directory) + 1) AS EndPosition,
1047 SUBSTRING(@Directory, 1, ISNULL(NULLIF(CHARINDEX(',', @Directory, 1), 0), LEN(@Directory) + 1) - 1) AS Directory
1048 WHERE @Directory IS NOT NULL
1049 UNION ALL
1050 SELECT CAST(EndPosition AS int) + 1 AS StartPosition,
1051 ISNULL(NULLIF(CHARINDEX(',', @Directory, EndPosition + 1), 0), LEN(@Directory) + 1) AS EndPosition,
1052 SUBSTRING(@Directory, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(',', @Directory, EndPosition + 1), 0), LEN(@Directory) + 1) - EndPosition - 1) AS Directory
1053 FROM Directories
1054 WHERE EndPosition < LEN(@Directory) + 1
1055 )
1056 INSERT INTO @Directories (ID, DirectoryPath, Mirror, Completed)
1057 SELECT ROW_NUMBER() OVER(ORDER BY StartPosition ASC) AS ID,
1058 Directory,
1059 0,
1060 0
1061 FROM Directories
1062 OPTION (MAXRECURSION 0)
1063 END
1064
1065 SET @MirrorDirectory = REPLACE(@MirrorDirectory, CHAR(10), '')
1066 SET @MirrorDirectory = REPLACE(@MirrorDirectory, CHAR(13), '')
1067
1068 WHILE CHARINDEX(', ',@MirrorDirectory) > 0 SET @MirrorDirectory = REPLACE(@MirrorDirectory,', ',',')
1069 WHILE CHARINDEX(' ,',@MirrorDirectory) > 0 SET @MirrorDirectory = REPLACE(@MirrorDirectory,' ,',',')
1070
1071 SET @MirrorDirectory = LTRIM(RTRIM(@MirrorDirectory));
1072
1073 WITH Directories (StartPosition, EndPosition, Directory) AS
1074 (
1075 SELECT 1 AS StartPosition,
1076 ISNULL(NULLIF(CHARINDEX(',', @MirrorDirectory, 1), 0), LEN(@MirrorDirectory) + 1) AS EndPosition,
1077 SUBSTRING(@MirrorDirectory, 1, ISNULL(NULLIF(CHARINDEX(',', @MirrorDirectory, 1), 0), LEN(@MirrorDirectory) + 1) - 1) AS Directory
1078 WHERE @MirrorDirectory IS NOT NULL
1079 UNION ALL
1080 SELECT CAST(EndPosition AS int) + 1 AS StartPosition,
1081 ISNULL(NULLIF(CHARINDEX(',', @MirrorDirectory, EndPosition + 1), 0), LEN(@MirrorDirectory) + 1) AS EndPosition,
1082 SUBSTRING(@MirrorDirectory, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(',', @MirrorDirectory, EndPosition + 1), 0), LEN(@MirrorDirectory) + 1) - EndPosition - 1) AS Directory
1083 FROM Directories
1084 WHERE EndPosition < LEN(@MirrorDirectory) + 1
1085 )
1086 INSERT INTO @Directories (ID, DirectoryPath, Mirror, Completed)
1087 SELECT (SELECT COUNT(*) FROM @Directories) + ROW_NUMBER() OVER(ORDER BY StartPosition ASC) AS ID,
1088 Directory,
1089 1,
1090 0
1091 FROM Directories
1092 OPTION (MAXRECURSION 0)
1093
1094 ----------------------------------------------------------------------------------------------------
1095 --// Check directories //--
1096 ----------------------------------------------------------------------------------------------------
1097
1098 SET @DirectoryCheck = 1
1099
1100 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')
1101 BEGIN
1102 SET @ErrorMessage = 'The value for the parameter @Directory is not supported.' + CHAR(13) + CHAR(10) + ' '
1103 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1104 SET @Error = @@ERROR
1105 SET @DirectoryCheck = 0
1106 END
1107
1108 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')
1109 BEGIN
1110 SET @ErrorMessage = 'The value for the parameter @MirrorDirectory is not supported.' + CHAR(13) + CHAR(10) + ' '
1111 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1112 SET @Error = @@ERROR
1113 SET @DirectoryCheck = 0
1114 END
1115
1116 IF @DirectoryCheck = 1
1117 BEGIN
1118 WHILE (1 = 1)
1119 BEGIN
1120 SELECT TOP 1 @CurrentRootDirectoryID = ID,
1121 @CurrentRootDirectoryPath = DirectoryPath
1122 FROM @Directories
1123 WHERE Completed = 0
1124 ORDER BY ID ASC
1125
1126 IF @@ROWCOUNT = 0
1127 BEGIN
1128 BREAK
1129 END
1130
1131 INSERT INTO @DirectoryInfo (FileExists, FileIsADirectory, ParentDirectoryExists)
1132 EXECUTE [master].dbo.xp_fileexist @CurrentRootDirectoryPath
1133
1134 IF NOT EXISTS (SELECT * FROM @DirectoryInfo WHERE FileExists = 0 AND FileIsADirectory = 1 AND ParentDirectoryExists = 1)
1135 BEGIN
1136 SET @ErrorMessage = 'The directory ' + @CurrentRootDirectoryPath + ' does not exist.' + CHAR(13) + CHAR(10) + ' '
1137 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1138 SET @Error = @@ERROR
1139 END
1140
1141 UPDATE @Directories
1142 SET Completed = 1
1143 WHERE ID = @CurrentRootDirectoryID
1144
1145 SET @CurrentRootDirectoryID = NULL
1146 SET @CurrentRootDirectoryPath = NULL
1147
1148 DELETE FROM @DirectoryInfo
1149 END
1150 END
1151
1152 ----------------------------------------------------------------------------------------------------
1153 --// Select URLs //--
1154 ----------------------------------------------------------------------------------------------------
1155
1156 INSERT INTO @URLs (DirectoryPath, Mirror)
1157 SELECT @URL, 0
1158 WHERE @URL IS NOT NULL
1159
1160 INSERT INTO @URLs (DirectoryPath, Mirror)
1161 SELECT @MirrorURL, 1
1162 WHERE @MirrorURL IS NOT NULL
1163
1164 ----------------------------------------------------------------------------------------------------
1165 --// Get directory separator //--
1166 ----------------------------------------------------------------------------------------------------
1167
1168 SELECT @DirectorySeparator = CASE
1169 WHEN @URL IS NOT NULL THEN '/'
1170 WHEN @HostPlatform = 'Windows' THEN '\'
1171 WHEN @HostPlatform = 'Linux' THEN '/'
1172 END
1173
1174 UPDATE @Directories
1175 SET DirectoryPath = LEFT(DirectoryPath,LEN(DirectoryPath) - 1)
1176 WHERE RIGHT(DirectoryPath,1) = @DirectorySeparator
1177
1178 UPDATE @URLs
1179 SET DirectoryPath = LEFT(DirectoryPath,LEN(DirectoryPath) - 1)
1180 WHERE RIGHT(DirectoryPath,1) = @DirectorySeparator
1181
1182 ----------------------------------------------------------------------------------------------------
1183 --// Get file extension //--
1184 ----------------------------------------------------------------------------------------------------
1185
1186 IF @FileExtensionFull IS NULL
1187 BEGIN
1188 SELECT @FileExtensionFull = CASE
1189 WHEN @BackupSoftware IS NULL THEN 'bak'
1190 WHEN @BackupSoftware = 'LITESPEED' THEN 'bak'
1191 WHEN @BackupSoftware = 'SQLBACKUP' THEN 'sqb'
1192 WHEN @BackupSoftware = 'SQLSAFE' THEN 'safe'
1193 END
1194 END
1195
1196 IF @FileExtensionDiff IS NULL
1197 BEGIN
1198 SELECT @FileExtensionDiff = CASE
1199 WHEN @BackupSoftware IS NULL THEN 'bak'
1200 WHEN @BackupSoftware = 'LITESPEED' THEN 'bak'
1201 WHEN @BackupSoftware = 'SQLBACKUP' THEN 'sqb'
1202 WHEN @BackupSoftware = 'SQLSAFE' THEN 'safe'
1203 END
1204 END
1205
1206 IF @FileExtensionLog IS NULL
1207 BEGIN
1208 SELECT @FileExtensionLog = CASE
1209 WHEN @BackupSoftware IS NULL THEN 'trn'
1210 WHEN @BackupSoftware = 'LITESPEED' THEN 'trn'
1211 WHEN @BackupSoftware = 'SQLBACKUP' THEN 'sqb'
1212 WHEN @BackupSoftware = 'SQLSAFE' THEN 'safe'
1213 END
1214 END
1215
1216 ----------------------------------------------------------------------------------------------------
1217 --// Get default compression //--
1218 ----------------------------------------------------------------------------------------------------
1219
1220 IF @Compress IS NULL
1221 BEGIN
1222 SELECT @Compress = CASE
1223 WHEN @BackupSoftware IS NULL AND EXISTS(SELECT * FROM sys.configurations WHERE name = 'backup compression default' AND value_in_use = 1) THEN 'Y'
1224 WHEN @BackupSoftware IS NULL AND NOT EXISTS(SELECT * FROM sys.configurations WHERE name = 'backup compression default' AND value_in_use = 1) THEN 'N'
1225 WHEN @BackupSoftware IS NOT NULL AND (@CompressionLevel IS NULL OR @CompressionLevel > 0) THEN 'Y'
1226 WHEN @BackupSoftware IS NOT NULL AND @CompressionLevel = 0 THEN 'N'
1227 END
1228 END
1229
1230 ----------------------------------------------------------------------------------------------------
1231 --// Get number of files //--
1232 ----------------------------------------------------------------------------------------------------
1233
1234 IF @NumberOfFiles IS NULL
1235 BEGIN
1236 SELECT @NumberOfFiles = CASE WHEN @URL IS NOT NULL THEN 1 WHEN @BackupSoftware = 'DATA_DOMAIN_BOOST' THEN 1 ELSE (SELECT COUNT(*) FROM @Directories WHERE Mirror = 0) END
1237 END
1238
1239 ----------------------------------------------------------------------------------------------------
1240 --// Check input parameters //--
1241 ----------------------------------------------------------------------------------------------------
1242
1243 IF @BackupType NOT IN ('FULL','DIFF','LOG') OR @BackupType IS NULL
1244 BEGIN
1245 SET @ErrorMessage = 'The value for the parameter @BackupType is not supported.' + CHAR(13) + CHAR(10) + ' '
1246 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1247 SET @Error = @@ERROR
1248 END
1249
1250 IF SERVERPROPERTY('EngineEdition') = 8 AND NOT (@BackupType = 'FULL' AND @CopyOnly = 'Y')
1251 BEGIN
1252 SET @ErrorMessage = 'SQL Database Managed Instance only supports COPY_ONLY full backups.' + CHAR(13) + CHAR(10) + ' '
1253 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1254 SET @Error = @@ERROR
1255 END
1256
1257 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')
1258 BEGIN
1259 SET @ErrorMessage = 'The value for the parameter @Verify is not supported.' + CHAR(13) + CHAR(10) + ' '
1260 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1261 SET @Error = @@ERROR
1262 END
1263
1264 IF @CleanupTime < 0
1265 BEGIN
1266 SET @ErrorMessage = 'The value for the parameter @CleanupTime is not supported.' + CHAR(13) + CHAR(10) + ' '
1267 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1268 SET @Error = @@ERROR
1269 END
1270
1271 IF @CleanupTime IS NOT NULL AND @URL IS NOT NULL
1272 BEGIN
1273 SET @ErrorMessage = 'The value for the parameter @CleanupTime is not supported. Cleanup is not supported on Azure Blob Storage.' + CHAR(13) + CHAR(10) + ' '
1274 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1275 SET @Error = @@ERROR
1276 END
1277
1278 IF @CleanupTime IS NOT NULL AND @HostPlatform = 'Linux'
1279 BEGIN
1280 SET @ErrorMessage = 'The value for the parameter @CleanupTime is not supported. Cleanup is not supported on Linux.' + CHAR(13) + CHAR(10) + ' '
1281 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1282 SET @Error = @@ERROR
1283 END
1284
1285 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)))
1286 BEGIN
1287 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.' + CHAR(13) + CHAR(10) + ' '
1288 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1289 SET @Error = @@ERROR
1290 END
1291
1292 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)))
1293 BEGIN
1294 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.' + CHAR(13) + CHAR(10) + ' '
1295 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1296 SET @Error = @@ERROR
1297 END
1298
1299 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)))
1300 BEGIN
1301 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.' + CHAR(13) + CHAR(10) + ' '
1302 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1303 SET @Error = @@ERROR
1304 END
1305
1306 IF @CleanupMode NOT IN('BEFORE_BACKUP','AFTER_BACKUP') OR @CleanupMode IS NULL
1307 BEGIN
1308 SET @ErrorMessage = 'The value for the parameter @CleanupMode is not supported.' + CHAR(13) + CHAR(10) + ' '
1309 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1310 SET @Error = @@ERROR
1311 END
1312
1313 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)
1314 BEGIN
1315 SET @ErrorMessage = 'The value for the parameter @Compress is not supported.' + CHAR(13) + CHAR(10) + ' '
1316 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1317 SET @Error = @@ERROR
1318 END
1319
1320 IF @CopyOnly NOT IN ('Y','N') OR @CopyOnly IS NULL
1321 BEGIN
1322 SET @ErrorMessage = 'The value for the parameter @CopyOnly is not supported.' + CHAR(13) + CHAR(10) + ' '
1323 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1324 SET @Error = @@ERROR
1325 END
1326
1327 IF @ChangeBackupType NOT IN ('Y','N') OR @ChangeBackupType IS NULL
1328 BEGIN
1329 SET @ErrorMessage = 'The value for the parameter @ChangeBackupType is not supported.' + CHAR(13) + CHAR(10) + ' '
1330 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1331 SET @Error = @@ERROR
1332 END
1333
1334 IF @BackupSoftware NOT IN ('LITESPEED','SQLBACKUP','SQLSAFE','DATA_DOMAIN_BOOST') OR (@BackupSoftware IS NOT NULL AND @HostPlatform = 'Linux')
1335 BEGIN
1336 SET @ErrorMessage = 'The value for the parameter @BackupSoftware is not supported.' + CHAR(13) + CHAR(10) + ' '
1337 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1338 SET @Error = @@ERROR
1339 END
1340
1341 IF @BackupSoftware = 'LITESPEED' AND NOT EXISTS (SELECT * FROM [master].sys.objects WHERE [type] = 'X' AND [name] = 'xp_backup_database')
1342 BEGIN
1343 SET @ErrorMessage = 'LiteSpeed for SQL Server is not installed. Download https://www.quest.com/products/litespeed-for-sql-server/.' + CHAR(13) + CHAR(10) + ' '
1344 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1345 SET @Error = @@ERROR
1346 END
1347
1348 IF @BackupSoftware = 'SQLBACKUP' AND NOT EXISTS (SELECT * FROM [master].sys.objects WHERE [type] = 'X' AND [name] = 'sqlbackup')
1349 BEGIN
1350 SET @ErrorMessage = 'Red Gate SQL Backup Pro is not installed. Download https://www.red-gate.com/products/dba/sql-backup/.' + CHAR(13) + CHAR(10) + ' '
1351 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1352 SET @Error = @@ERROR
1353 END
1354
1355 IF @BackupSoftware = 'SQLSAFE' AND NOT EXISTS (SELECT * FROM [master].sys.objects WHERE [type] = 'X' AND [name] = 'xp_ss_backup')
1356 BEGIN
1357 SET @ErrorMessage = 'Idera SQL Safe Backup is not installed. Download https://www.idera.com/productssolutions/sqlserver/sqlsafebackup.' + CHAR(13) + CHAR(10) + ' '
1358 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1359 SET @Error = @@ERROR
1360 END
1361
1362 IF @BackupSoftware = 'DATA_DOMAIN_BOOST' AND NOT EXISTS (SELECT * FROM [master].sys.objects WHERE [type] = 'PC' AND [name] = 'emc_run_backup')
1363 BEGIN
1364 SET @ErrorMessage = 'EMC Data Domain Boost is not installed. Download https://www.emc.com/en-us/data-protection/data-domain.htm.' + CHAR(13) + CHAR(10) + ' '
1365 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1366 SET @Error = @@ERROR
1367 END
1368
1369 IF @CheckSum NOT IN ('Y','N') OR @CheckSum IS NULL
1370 BEGIN
1371 SET @ErrorMessage = 'The value for the parameter @CheckSum is not supported.' + CHAR(13) + CHAR(10) + ' '
1372 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1373 SET @Error = @@ERROR
1374 END
1375
1376 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')
1377 BEGIN
1378 SET @ErrorMessage = 'The value for the parameter @BlockSize is not supported.' + CHAR(13) + CHAR(10) + ' '
1379 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1380 SET @Error = @@ERROR
1381 END
1382
1383 IF @BufferCount <= 0 OR @BufferCount > 2147483647 OR (@BufferCount IS NOT NULL AND @BackupSoftware = 'SQLBACKUP') OR (@BufferCount IS NOT NULL AND @BackupSoftware = 'SQLSAFE')
1384 BEGIN
1385 SET @ErrorMessage = 'The value for the parameter @BufferCount is not supported.' + CHAR(13) + CHAR(10) + ' '
1386 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1387 SET @Error = @@ERROR
1388 END
1389
1390 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')
1391 BEGIN
1392 SET @ErrorMessage = 'The value for the parameter @MaxTransferSize is not supported.' + CHAR(13) + CHAR(10) + ' '
1393 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1394 SET @Error = @@ERROR
1395 END
1396
1397 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')
1398 BEGIN
1399 SET @ErrorMessage = 'The value for the parameter @NumberOfFiles is not supported.' + CHAR(13) + CHAR(10) + ' '
1400 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1401 SET @Error = @@ERROR
1402 END
1403
1404 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')
1405 BEGIN
1406 SET @ErrorMessage = 'The value for the parameter @CompressionLevel is not supported.' + CHAR(13) + CHAR(10) + ' '
1407 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1408 SET @Error = @@ERROR
1409 END
1410
1411 IF LEN(@Description) > 255 OR (@BackupSoftware = 'LITESPEED' AND LEN(@Description) > 128) OR (@BackupSoftware = 'DATA_DOMAIN_BOOST' AND LEN(@Description) > 254)
1412 BEGIN
1413 SET @ErrorMessage = 'The value for the parameter @Description is not supported.' + CHAR(13) + CHAR(10) + ' '
1414 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1415 SET @Error = @@ERROR
1416 END
1417
1418 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))
1419 BEGIN
1420 SET @ErrorMessage = 'The value for the parameter @Threads is not supported.' + CHAR(13) + CHAR(10) + ' '
1421 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1422 SET @Error = @@ERROR
1423 END
1424
1425 IF @Throttle IS NOT NULL AND (@BackupSoftware NOT IN('LITESPEED') OR @BackupSoftware IS NULL) OR @Throttle < 1 OR @Throttle > 100
1426 BEGIN
1427 SET @ErrorMessage = 'The value for the parameter @Throttle is not supported.' + CHAR(13) + CHAR(10) + ' '
1428 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1429 SET @Error = @@ERROR
1430 END
1431
1432 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')
1433 BEGIN
1434 SET @ErrorMessage = 'The value for the parameter @Encrypt is not supported.' + CHAR(13) + CHAR(10) + ' '
1435 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1436 SET @Error = @@ERROR
1437 END
1438
1439 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')
1440 BEGIN
1441 SET @ErrorMessage = 'The value for the parameter @EncryptionAlgorithm is not supported.' + CHAR(13) + CHAR(10) + ' '
1442 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1443 SET @Error = @@ERROR
1444 END
1445
1446 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))
1447 BEGIN
1448 SET @ErrorMessage = 'The value for the parameter @ServerCertificate is not supported.' + CHAR(13) + CHAR(10) + ' '
1449 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1450 SET @Error = @@ERROR
1451 END
1452
1453 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))
1454 BEGIN
1455 SET @ErrorMessage = 'The value for the parameter @ServerAsymmetricKey is not supported.' + CHAR(13) + CHAR(10) + ' '
1456 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1457 SET @Error = @@ERROR
1458 END
1459
1460 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')
1461 BEGIN
1462 SET @ErrorMessage = 'The value for the parameter @EncryptionKey is not supported.' + CHAR(13) + CHAR(10) + ' '
1463 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1464 SET @Error = @@ERROR
1465 END
1466
1467 IF @ReadWriteFileGroups NOT IN('Y','N') OR @ReadWriteFileGroups IS NULL OR (@ReadWriteFileGroups = 'Y' AND @BackupType = 'LOG')
1468 BEGIN
1469 SET @ErrorMessage = 'The value for the parameter @ReadWriteFileGroups is not supported.' + CHAR(13) + CHAR(10) + ' '
1470 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1471 SET @Error = @@ERROR
1472 END
1473
1474 IF @OverrideBackupPreference NOT IN('Y','N') OR @OverrideBackupPreference IS NULL
1475 BEGIN
1476 SET @ErrorMessage = 'The value for the parameter @OverrideBackupPreference is not supported.' + CHAR(13) + CHAR(10) + ' '
1477 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1478 SET @Error = @@ERROR
1479 END
1480
1481 IF @NoRecovery NOT IN('Y','N') OR @NoRecovery IS NULL OR (@NoRecovery = 'Y' AND @BackupType <> 'LOG') OR (@NoRecovery = 'Y' AND @BackupSoftware = 'SQLSAFE')
1482 BEGIN
1483 SET @ErrorMessage = 'The value for the parameter @NoRecovery is not supported.' + CHAR(13) + CHAR(10) + ' '
1484 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1485 SET @Error = @@ERROR
1486 END
1487
1488 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) OR (@URL NOT LIKE 'https://%/%')
1489 BEGIN
1490 SET @ErrorMessage = 'The value for the parameter @URL is not supported.' + CHAR(13) + CHAR(10) + ' '
1491 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1492 SET @Error = @@ERROR
1493 END
1494
1495 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 credential_identity = 'SHARED ACCESS SIGNATURE')) OR (@Credential IS NOT NULL AND NOT EXISTS(SELECT * FROM sys.credentials WHERE name = @Credential))
1496 BEGIN
1497 SET @ErrorMessage = 'The value for the parameter @Credential is not supported.' + CHAR(13) + CHAR(10) + ' '
1498 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1499 SET @Error = @@ERROR
1500 END
1501
1502 IF @MirrorCleanupTime < 0 OR (@MirrorCleanupTime IS NOT NULL AND @MirrorDirectory IS NULL)
1503 BEGIN
1504 SET @ErrorMessage = 'The value for the parameter @MirrorCleanupTime is not supported.' + CHAR(13) + CHAR(10) + ' '
1505 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1506 SET @Error = @@ERROR
1507 END
1508
1509 IF @MirrorCleanupMode NOT IN('BEFORE_BACKUP','AFTER_BACKUP') OR @MirrorCleanupMode IS NULL
1510 BEGIN
1511 SET @ErrorMessage = 'The value for the parameter @MirrorCleanupMode is not supported.' + CHAR(13) + CHAR(10) + ' '
1512 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1513 SET @Error = @@ERROR
1514 END
1515
1516 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 NOT LIKE 'https://%/%') OR (@MirrorURL IS NOT NULL AND @URL IS NULL)
1517 BEGIN
1518 SET @ErrorMessage = 'The value for the parameter @MirrorURL is not supported.' + CHAR(13) + CHAR(10) + ' '
1519 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1520 SET @Error = @@ERROR
1521 END
1522
1523 IF @Updateability NOT IN('READ_ONLY','READ_WRITE','ALL') OR @Updateability IS NULL
1524 BEGIN
1525 SET @ErrorMessage = 'The value for the parameter @Updateability is not supported.' + CHAR(13) + CHAR(10) + ' '
1526 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1527 SET @Error = @@ERROR
1528 END
1529
1530 IF @AdaptiveCompression NOT IN('SIZE','SPEED') OR (@AdaptiveCompression IS NOT NULL AND (@BackupSoftware NOT IN('LITESPEED') OR @BackupSoftware IS NULL))
1531 BEGIN
1532 SET @ErrorMessage = 'The value for the parameter @AdaptiveCompression is not supported.' + CHAR(13) + CHAR(10) + ' '
1533 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1534 SET @Error = @@ERROR
1535 END
1536
1537 IF (@ModificationLevel IS NOT NULL AND NOT (@Version >= 13.05026)) OR (@ModificationLevel IS NOT NULL AND @ChangeBackupType = 'N') OR (@ModificationLevel IS NOT NULL AND @BackupType <> 'DIFF')
1538 BEGIN
1539 SET @ErrorMessage = 'The value for the parameter @ModificationLevel is not supported.' + CHAR(13) + CHAR(10) + ' '
1540 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1541 SET @Error = @@ERROR
1542 END
1543
1544 IF (@LogSizeSinceLastLogBackup IS NOT NULL AND NOT (@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')
1545 BEGIN
1546 SET @ErrorMessage = 'The value for the parameter @LogSizeSinceLastLogBackup is not supported.' + CHAR(13) + CHAR(10) + ' '
1547 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1548 SET @Error = @@ERROR
1549 END
1550
1551 IF (@TimeSinceLastLogBackup IS NOT NULL AND NOT (@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')
1552 BEGIN
1553 SET @ErrorMessage = 'The value for the parameter @TimeSinceLastLogBackup is not supported.' + CHAR(13) + CHAR(10) + ' '
1554 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1555 SET @Error = @@ERROR
1556 END
1557
1558 IF (@DataDomainBoostHost IS NOT NULL AND (@BackupSoftware <> 'DATA_DOMAIN_BOOST' OR @BackupSoftware IS NULL)) OR (@DataDomainBoostHost IS NULL AND @BackupSoftware = 'DATA_DOMAIN_BOOST')
1559 BEGIN
1560 SET @ErrorMessage = 'The value for the parameter @DataDomainBoostHost is not supported.' + CHAR(13) + CHAR(10) + ' '
1561 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1562 SET @Error = @@ERROR
1563 END
1564
1565 IF (@DataDomainBoostUser IS NOT NULL AND (@BackupSoftware <> 'DATA_DOMAIN_BOOST' OR @BackupSoftware IS NULL)) OR (@DataDomainBoostUser IS NULL AND @BackupSoftware = 'DATA_DOMAIN_BOOST')
1566 BEGIN
1567 SET @ErrorMessage = 'The value for the parameter @DataDomainBoostUser is not supported.' + CHAR(13) + CHAR(10) + ' '
1568 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1569 SET @Error = @@ERROR
1570 END
1571
1572 IF (@DataDomainBoostDevicePath IS NOT NULL AND (@BackupSoftware <> 'DATA_DOMAIN_BOOST' OR @BackupSoftware IS NULL)) OR (@DataDomainBoostDevicePath IS NULL AND @BackupSoftware = 'DATA_DOMAIN_BOOST')
1573 BEGIN
1574 SET @ErrorMessage = 'The value for the parameter @DataDomainBoostDevicePath is not supported.' + CHAR(13) + CHAR(10) + ' '
1575 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1576 SET @Error = @@ERROR
1577 END
1578
1579 IF @DataDomainBoostLockboxPath IS NOT NULL AND (@BackupSoftware <> 'DATA_DOMAIN_BOOST' OR @BackupSoftware IS NULL)
1580 BEGIN
1581 SET @ErrorMessage = 'The value for the parameter @DataDomainBoostLockboxPath is not supported.' + CHAR(13) + CHAR(10) + ' '
1582 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1583 SET @Error = @@ERROR
1584 END
1585
1586 IF @DirectoryStructure = ''
1587 BEGIN
1588 SET @ErrorMessage = 'The value for the parameter @DirectoryStructure is not supported.' + CHAR(13) + CHAR(10) + ' '
1589 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1590 SET @Error = @@ERROR
1591 END
1592
1593 IF @AvailabilityGroupDirectoryStructure = ''
1594 BEGIN
1595 SET @ErrorMessage = 'The value for the parameter @AvailabilityGroupDirectoryStructure is not supported.' + CHAR(13) + CHAR(10) + ' '
1596 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1597 SET @Error = @@ERROR
1598 END
1599
1600 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 '%\%'
1601 BEGIN
1602 SET @ErrorMessage = 'The value for the parameter @FileName is not supported.' + CHAR(13) + CHAR(10) + ' '
1603 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1604 SET @Error = @@ERROR
1605 END
1606
1607 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 '%\%'
1608 BEGIN
1609 SET @ErrorMessage = 'The value for the parameter @AvailabilityGroupFileName is not supported.' + CHAR(13) + CHAR(10) + ' '
1610 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1611 SET @Error = @@ERROR
1612 END
1613
1614 IF 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}','') LIKE '%{%'
1615 OR 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}','') LIKE '%}%'
1616 BEGIN
1617 SET @ErrorMessage = 'The parameter @DirectoryStructure contains one or more tokens that are not supported.' + CHAR(13) + CHAR(10) + ' '
1618 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1619 SET @Error = @@ERROR
1620 END
1621
1622 IF 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}','') LIKE '%{%'
1623 OR 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}','') LIKE '%}%'
1624 BEGIN
1625 SET @ErrorMessage = 'The parameter @AvailabilityGroupDirectoryStructure contains one or more tokens that are not supported.' + CHAR(13) + CHAR(10) + ' '
1626 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1627 SET @Error = @@ERROR
1628 END
1629
1630 IF 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}',''),'{FileNumber}',''),'{FileExtension}','') LIKE '%{%'
1631 OR 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}',''),'{FileNumber}',''),'{FileExtension}','') LIKE '%}%'
1632 BEGIN
1633 SET @ErrorMessage = 'The parameter @FileName contains one or more tokens that are not supported.' + CHAR(13) + CHAR(10) + ' '
1634 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1635 SET @Error = @@ERROR
1636 END
1637
1638 IF 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}',''),'{FileNumber}',''),'{FileExtension}','') LIKE '%{%'
1639 OR 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}',''),'{FileNumber}',''),'{FileExtension}','') LIKE '%}%'
1640 BEGIN
1641 SET @ErrorMessage = 'The parameter @AvailabilityGroupFileName contains one or more tokens that are not supported.' + CHAR(13) + CHAR(10) + ' '
1642 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1643 SET @Error = @@ERROR
1644 END
1645
1646 IF @FileExtensionFull LIKE '%.%'
1647 BEGIN
1648 SET @ErrorMessage = 'The value for the parameter @FileExtensionFull is not supported.' + CHAR(13) + CHAR(10) + ' '
1649 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1650 SET @Error = @@ERROR
1651 END
1652
1653 IF @FileExtensionDiff LIKE '%.%'
1654 BEGIN
1655 SET @ErrorMessage = 'The value for the parameter @FileExtensionDiff is not supported.' + CHAR(13) + CHAR(10) + ' '
1656 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1657 SET @Error = @@ERROR
1658 END
1659
1660 IF @FileExtensionLog LIKE '%.%'
1661 BEGIN
1662 SET @ErrorMessage = 'The value for the parameter @FileExtensionLog is not supported.' + CHAR(13) + CHAR(10) + ' '
1663 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1664 SET @Error = @@ERROR
1665 END
1666
1667 IF @Init NOT IN('Y','N') OR @Init IS NULL OR (@Init = 'Y' AND @BackupType = 'LOG') OR (@Init = 'Y' AND @BackupSoftware = 'DATA_DOMAIN_BOOST')
1668 BEGIN
1669 SET @ErrorMessage = 'The value for the parameter @Init is not supported.' + CHAR(13) + CHAR(10) + ' '
1670 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1671 SET @Error = @@ERROR
1672 END
1673
1674 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 >= 13.05026 OR SERVERPROPERTY('EngineEdition') = 8)) OR (@DatabaseOrder IS NOT NULL AND SERVERPROPERTY('EngineEdition') = 5)
1675 BEGIN
1676 SET @ErrorMessage = 'The value for the parameter @DatabaseOrder is not supported.' + CHAR(13) + CHAR(10) + ' '
1677 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1678 SET @Error = @@ERROR
1679 END
1680
1681 IF @DatabasesInParallel NOT IN('Y','N') OR @DatabasesInParallel IS NULL OR (@DatabasesInParallel = 'Y' AND SERVERPROPERTY('EngineEdition') = 5)
1682 BEGIN
1683 SET @ErrorMessage = 'The value for the parameter @DatabasesInParallel is not supported.' + CHAR(13) + CHAR(10) + ' '
1684 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1685 SET @Error = @@ERROR
1686 END
1687
1688 IF @LogToTable NOT IN('Y','N') OR @LogToTable IS NULL
1689 BEGIN
1690 SET @ErrorMessage = 'The value for the parameter @LogToTable is not supported.' + CHAR(13) + CHAR(10) + ' '
1691 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1692 SET @Error = @@ERROR
1693 END
1694
1695 IF @Execute NOT IN('Y','N') OR @Execute IS NULL
1696 BEGIN
1697 SET @ErrorMessage = 'The value for the parameter @Execute is not supported.' + CHAR(13) + CHAR(10) + ' '
1698 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1699 SET @Error = @@ERROR
1700 END
1701
1702 IF @Error <> 0
1703 BEGIN
1704 SET @ErrorMessage = 'The documentation is available at https://FixSQL.co.uk/sql-server-backup.html.' + CHAR(13) + CHAR(10) + ' '
1705 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1706 SET @ReturnCode = @Error
1707 GOTO Logging
1708 END
1709
1710 ----------------------------------------------------------------------------------------------------
1711 --// Check that selected databases and availability groups exist //--
1712 ----------------------------------------------------------------------------------------------------
1713
1714 SET @ErrorMessage = ''
1715 SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + ', '
1716 FROM @SelectedDatabases
1717 WHERE DatabaseName NOT LIKE '%[%]%'
1718 AND DatabaseName NOT IN (SELECT DatabaseName FROM @tmpDatabases)
1719 IF @@ROWCOUNT > 0
1720 BEGIN
1721 SET @ErrorMessage = 'The following databases in the @Databases parameter do not exist: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.' + CHAR(13) + CHAR(10) + ' '
1722 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1723 SET @Error = @@ERROR
1724 END
1725
1726 SET @ErrorMessage = ''
1727 SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(AvailabilityGroupName) + ', '
1728 FROM @SelectedAvailabilityGroups
1729 WHERE AvailabilityGroupName NOT LIKE '%[%]%'
1730 AND AvailabilityGroupName NOT IN (SELECT AvailabilityGroupName FROM @tmpAvailabilityGroups)
1731 IF @@ROWCOUNT > 0
1732 BEGIN
1733 SET @ErrorMessage = 'The following availability groups do not exist: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.' + CHAR(13) + CHAR(10) + ' '
1734 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1735 SET @Error = @@ERROR
1736 END
1737
1738 ----------------------------------------------------------------------------------------------------
1739 --// Check @@SERVERNAME //--
1740 ----------------------------------------------------------------------------------------------------
1741
1742 IF @@SERVERNAME <> CAST(SERVERPROPERTY('ServerName') AS nvarchar(max)) AND SERVERPROPERTY('IsHadrEnabled') = 1
1743 BEGIN
1744 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 + '.' + CHAR(13) + CHAR(10) + ' '
1745 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1746 SET @Error = @@ERROR
1747 END
1748
1749 ----------------------------------------------------------------------------------------------------
1750 --// Check Availability Group cluster name //--
1751 ----------------------------------------------------------------------------------------------------
1752
1753 IF @Version >= 11 AND SERVERPROPERTY('IsHadrEnabled') = 1
1754 BEGIN
1755 SELECT @Cluster = NULLIF(cluster_name,'')
1756 FROM sys.dm_hadr_cluster
1757 END
1758
1759 ----------------------------------------------------------------------------------------------------
1760 --// Update database order //--
1761 ----------------------------------------------------------------------------------------------------
1762
1763 IF @DatabaseOrder IN('DATABASE_SIZE_ASC','DATABASE_SIZE_DESC')
1764 BEGIN
1765 UPDATE tmpDatabases
1766 SET DatabaseSize = (SELECT SUM(size) FROM sys.master_files WHERE [type] = 0 AND database_id = DB_ID(tmpDatabases.DatabaseName))
1767 FROM @tmpDatabases tmpDatabases
1768 END
1769
1770 IF @DatabaseOrder IN('LOG_SIZE_SINCE_LAST_LOG_BACKUP_ASC','LOG_SIZE_SINCE_LAST_LOG_BACKUP_DESC')
1771 BEGIN
1772 UPDATE tmpDatabases
1773 SET LogSizeSinceLastLogBackup = (SELECT log_since_last_log_backup_mb FROM sys.dm_db_log_stats(DB_ID(tmpDatabases.DatabaseName)))
1774 FROM @tmpDatabases tmpDatabases
1775 END
1776
1777 IF @DatabaseOrder IS NULL
1778 BEGIN
1779 WITH tmpDatabases AS (
1780 SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY StartPosition ASC, DatabaseName ASC) AS RowNumber
1781 FROM @tmpDatabases tmpDatabases
1782 WHERE Selected = 1
1783 )
1784 UPDATE tmpDatabases
1785 SET [Order] = RowNumber
1786 END
1787 ELSE
1788 IF @DatabaseOrder = 'DATABASE_NAME_ASC'
1789 BEGIN
1790 WITH tmpDatabases AS (
1791 SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY DatabaseName ASC) AS RowNumber
1792 FROM @tmpDatabases tmpDatabases
1793 WHERE Selected = 1
1794 )
1795 UPDATE tmpDatabases
1796 SET [Order] = RowNumber
1797 END
1798 ELSE
1799 IF @DatabaseOrder = 'DATABASE_NAME_DESC'
1800 BEGIN
1801 WITH tmpDatabases AS (
1802 SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY DatabaseName DESC) AS RowNumber
1803 FROM @tmpDatabases tmpDatabases
1804 WHERE Selected = 1
1805 )
1806 UPDATE tmpDatabases
1807 SET [Order] = RowNumber
1808 END
1809 ELSE
1810 IF @DatabaseOrder = 'DATABASE_SIZE_ASC'
1811 BEGIN
1812 WITH tmpDatabases AS (
1813 SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY DatabaseSize ASC) AS RowNumber
1814 FROM @tmpDatabases tmpDatabases
1815 WHERE Selected = 1
1816 )
1817 UPDATE tmpDatabases
1818 SET [Order] = RowNumber
1819 END
1820 ELSE
1821 IF @DatabaseOrder = 'DATABASE_SIZE_DESC'
1822 BEGIN
1823 WITH tmpDatabases AS (
1824 SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY DatabaseSize DESC) AS RowNumber
1825 FROM @tmpDatabases tmpDatabases
1826 WHERE Selected = 1
1827 )
1828 UPDATE tmpDatabases
1829 SET [Order] = RowNumber
1830 END
1831 ELSE
1832 IF @DatabaseOrder = 'LOG_SIZE_SINCE_LAST_LOG_BACKUP_ASC'
1833 BEGIN
1834 WITH tmpDatabases AS (
1835 SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY LogSizeSinceLastLogBackup ASC) AS RowNumber
1836 FROM @tmpDatabases tmpDatabases
1837 WHERE Selected = 1
1838 )
1839 UPDATE tmpDatabases
1840 SET [Order] = RowNumber
1841 END
1842 ELSE
1843 IF @DatabaseOrder = 'LOG_SIZE_SINCE_LAST_LOG_BACKUP_DESC'
1844 BEGIN
1845 WITH tmpDatabases AS (
1846 SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY LogSizeSinceLastLogBackup DESC) AS RowNumber
1847 FROM @tmpDatabases tmpDatabases
1848 WHERE Selected = 1
1849 )
1850 UPDATE tmpDatabases
1851 SET [Order] = RowNumber
1852 END
1853
1854 ----------------------------------------------------------------------------------------------------
1855 --// Update the queue //--
1856 ----------------------------------------------------------------------------------------------------
1857
1858 IF @DatabasesInParallel = 'Y'
1859 BEGIN
1860
1861 BEGIN TRY
1862
1863 SELECT @QueueID = QueueID
1864 FROM dbo.[Queue]
1865 WHERE SchemaName = @SchemaName
1866 AND ObjectName = @ObjectName
1867 AND [Parameters] = @Parameters
1868
1869 IF @QueueID IS NULL
1870 BEGIN
1871 BEGIN TRANSACTION
1872
1873 SELECT @QueueID = QueueID
1874 FROM dbo.[Queue] WITH (UPDLOCK, TABLOCK)
1875 WHERE SchemaName = @SchemaName
1876 AND ObjectName = @ObjectName
1877 AND [Parameters] = @Parameters
1878
1879 IF @QueueID IS NULL
1880 BEGIN
1881 INSERT INTO dbo.[Queue] (SchemaName, ObjectName, [Parameters])
1882 SELECT @SchemaName, @ObjectName, @Parameters
1883
1884 SET @QueueID = SCOPE_IDENTITY()
1885 END
1886
1887 COMMIT TRANSACTION
1888 END
1889
1890 BEGIN TRANSACTION
1891
1892 UPDATE [Queue]
1893 SET QueueStartTime = GETDATE(),
1894 SessionID = @@SPID,
1895 RequestID = (SELECT request_id FROM sys.dm_exec_requests WHERE session_id = @@SPID),
1896 RequestStartTime = (SELECT start_time FROM sys.dm_exec_requests WHERE session_id = @@SPID)
1897 FROM dbo.[Queue] [Queue]
1898 WHERE QueueID = @QueueID
1899 AND NOT EXISTS (SELECT *
1900 FROM sys.dm_exec_requests
1901 WHERE session_id = [Queue].SessionID
1902 AND request_id = [Queue].RequestID
1903 AND start_time = [Queue].RequestStartTime)
1904 AND NOT EXISTS (SELECT *
1905 FROM dbo.QueueDatabase QueueDatabase
1906 INNER JOIN sys.dm_exec_requests ON QueueDatabase.SessionID = session_id AND QueueDatabase.RequestID = request_id AND QueueDatabase.RequestStartTime = start_time
1907 WHERE QueueDatabase.QueueID = @QueueID)
1908
1909 IF @@ROWCOUNT = 1
1910 BEGIN
1911 INSERT INTO dbo.QueueDatabase (QueueID, DatabaseName)
1912 SELECT @QueueID AS QueueID,
1913 DatabaseName
1914 FROM @tmpDatabases tmpDatabases
1915 WHERE Selected = 1
1916 AND NOT EXISTS (SELECT * FROM dbo.QueueDatabase WHERE DatabaseName = tmpDatabases.DatabaseName AND QueueID = @QueueID)
1917
1918 DELETE QueueDatabase
1919 FROM dbo.QueueDatabase QueueDatabase
1920 WHERE QueueID = @QueueID
1921 AND NOT EXISTS (SELECT * FROM @tmpDatabases tmpDatabases WHERE DatabaseName = QueueDatabase.DatabaseName AND Selected = 1)
1922
1923 UPDATE QueueDatabase
1924 SET DatabaseOrder = tmpDatabases.[Order]
1925 FROM dbo.QueueDatabase QueueDatabase
1926 INNER JOIN @tmpDatabases tmpDatabases ON QueueDatabase.DatabaseName = tmpDatabases.DatabaseName
1927 WHERE QueueID = @QueueID
1928 END
1929
1930 COMMIT TRANSACTION
1931
1932 SELECT @QueueStartTime = QueueStartTime
1933 FROM dbo.[Queue]
1934 WHERE QueueID = @QueueID
1935
1936 END TRY
1937
1938 BEGIN CATCH
1939 IF XACT_STATE() <> 0
1940 BEGIN
1941 ROLLBACK TRANSACTION
1942 END
1943 SET @ErrorMessage = 'Msg ' + CAST(ERROR_NUMBER() AS nvarchar) + ', ' + ISNULL(ERROR_MESSAGE(),'') + CHAR(13) + CHAR(10) + ' '
1944 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
1945 SET @ReturnCode = ERROR_NUMBER()
1946 GOTO Logging
1947 END CATCH
1948
1949 END
1950
1951 ----------------------------------------------------------------------------------------------------
1952 --// Execute backup commands //--
1953 ----------------------------------------------------------------------------------------------------
1954
1955 WHILE (1 = 1)
1956 BEGIN
1957
1958 IF @DatabasesInParallel = 'Y'
1959 BEGIN
1960 UPDATE QueueDatabase
1961 SET DatabaseStartTime = NULL,
1962 SessionID = NULL,
1963 RequestID = NULL,
1964 RequestStartTime = NULL
1965 FROM dbo.QueueDatabase QueueDatabase
1966 WHERE QueueID = @QueueID
1967 AND DatabaseStartTime IS NOT NULL
1968 AND DatabaseEndTime IS NULL
1969 AND NOT EXISTS (SELECT * FROM sys.dm_exec_requests WHERE session_id = QueueDatabase.SessionID AND request_id = QueueDatabase.RequestID AND start_time = QueueDatabase.RequestStartTime)
1970
1971 UPDATE QueueDatabase
1972 SET DatabaseStartTime = GETDATE(),
1973 DatabaseEndTime = NULL,
1974 SessionID = @@SPID,
1975 RequestID = (SELECT request_id FROM sys.dm_exec_requests WHERE session_id = @@SPID),
1976 RequestStartTime = (SELECT start_time FROM sys.dm_exec_requests WHERE session_id = @@SPID),
1977 @CurrentDatabaseName = DatabaseName,
1978 @CurrentDatabaseNameFS = (SELECT DatabaseNameFS FROM @tmpDatabases WHERE DatabaseName = QueueDatabase.DatabaseName)
1979 FROM (SELECT TOP 1 DatabaseStartTime,
1980 DatabaseEndTime,
1981 SessionID,
1982 RequestID,
1983 RequestStartTime,
1984 DatabaseName
1985 FROM dbo.QueueDatabase
1986 WHERE QueueID = @QueueID
1987 AND (DatabaseStartTime < @QueueStartTime OR DatabaseStartTime IS NULL)
1988 AND NOT (DatabaseStartTime IS NOT NULL AND DatabaseEndTime IS NULL)
1989 ORDER BY DatabaseOrder ASC
1990 ) QueueDatabase
1991 END
1992 ELSE
1993 BEGIN
1994 SELECT TOP 1 @CurrentDBID = ID,
1995 @CurrentDatabaseName = DatabaseName,
1996 @CurrentDatabaseNameFS = DatabaseNameFS
1997 FROM @tmpDatabases
1998 WHERE Selected = 1
1999 AND Completed = 0
2000 ORDER BY [Order] ASC
2001 END
2002
2003 IF @@ROWCOUNT = 0
2004 BEGIN
2005 BREAK
2006 END
2007
2008 SET @CurrentDatabaseID = DB_ID(@CurrentDatabaseName)
2009
2010 IF DATABASEPROPERTYEX(@CurrentDatabaseName,'Status') = 'ONLINE'
2011 BEGIN
2012 IF EXISTS (SELECT * FROM sys.database_recovery_status WHERE database_id = @CurrentDatabaseID AND database_guid IS NOT NULL)
2013 BEGIN
2014 SET @CurrentIsDatabaseAccessible = 1
2015 END
2016 ELSE
2017 BEGIN
2018 SET @CurrentIsDatabaseAccessible = 0
2019 END
2020 END
2021
2022 IF @Version >= 11 AND SERVERPROPERTY('IsHadrEnabled') = 1
2023 BEGIN
2024 SELECT @CurrentAvailabilityGroup = availability_groups.name,
2025 @CurrentAvailabilityGroupRole = dm_hadr_availability_replica_states.role_desc,
2026 @CurrentAvailabilityGroupBackupPreference = UPPER(availability_groups.automated_backup_preference_desc)
2027 FROM sys.databases databases
2028 INNER JOIN sys.availability_databases_cluster availability_databases_cluster ON databases.group_database_id = availability_databases_cluster.group_database_id
2029 INNER JOIN sys.availability_groups availability_groups ON availability_databases_cluster.group_id = availability_groups.group_id
2030 INNER JOIN sys.dm_hadr_availability_replica_states dm_hadr_availability_replica_states ON availability_groups.group_id = dm_hadr_availability_replica_states.group_id AND databases.replica_id = dm_hadr_availability_replica_states.replica_id
2031 WHERE databases.name = @CurrentDatabaseName
2032 END
2033
2034 IF @Version >= 11 AND SERVERPROPERTY('IsHadrEnabled') = 1 AND @CurrentAvailabilityGroup IS NOT NULL
2035 BEGIN
2036 SELECT @CurrentIsPreferredBackupReplica = sys.fn_hadr_backup_is_preferred_replica(@CurrentDatabaseName)
2037 END
2038
2039 SELECT @CurrentDifferentialBaseLSN = differential_base_lsn
2040 FROM sys.master_files
2041 WHERE database_id = @CurrentDatabaseID
2042 AND [type] = 0
2043 AND [file_id] = 1
2044
2045 -- Workaround for a bug in SQL Server 2005
2046 IF @Version >= 9 AND @Version < 10
2047 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)
2048 BEGIN
2049 SET @CurrentDifferentialBaseLSN = NULL
2050 END
2051
2052 IF DATABASEPROPERTYEX(@CurrentDatabaseName,'Status') = 'ONLINE'
2053 BEGIN
2054 SELECT @CurrentLogLSN = last_log_backup_lsn
2055 FROM sys.database_recovery_status
2056 WHERE database_id = @CurrentDatabaseID
2057 END
2058
2059 IF DATABASEPROPERTYEX(@CurrentDatabaseName,'Status') = 'ONLINE' AND @Version >= 13.05026 AND (@CurrentAvailabilityGroupRole = 'PRIMARY' OR @CurrentAvailabilityGroupRole IS NULL)
2060 BEGIN
2061 SET @CurrentCommand07 = 'SELECT @ParamAllocatedExtentPageCount = SUM(allocated_extent_page_count), @ParamModifiedExtentPageCount = SUM(modified_extent_page_count) FROM ' + QUOTENAME(@CurrentDatabaseName) + '.sys.dm_db_file_space_usage'
2062
2063 EXECUTE sp_executesql @statement = @CurrentCommand07, @params = N'@ParamAllocatedExtentPageCount bigint OUTPUT, @ParamModifiedExtentPageCount bigint OUTPUT', @ParamAllocatedExtentPageCount = @CurrentAllocatedExtentPageCount OUTPUT, @ParamModifiedExtentPageCount = @CurrentModifiedExtentPageCount OUTPUT
2064 END
2065
2066 SET @CurrentBackupType = @BackupType
2067
2068 IF @ChangeBackupType = 'Y'
2069 BEGIN
2070 IF @CurrentBackupType = 'LOG' AND DATABASEPROPERTYEX(@CurrentDatabaseName,'Recovery') <> 'SIMPLE' AND @CurrentLogLSN IS NULL AND @CurrentDatabaseName <> 'master'
2071 BEGIN
2072 SET @CurrentBackupType = 'DIFF'
2073 END
2074 IF @CurrentBackupType = 'DIFF' AND @CurrentDatabaseName <> 'master' AND (@CurrentDifferentialBaseLSN IS NULL OR (@CurrentModifiedExtentPageCount * 1. / @CurrentAllocatedExtentPageCount * 100 >= @ModificationLevel))
2075 BEGIN
2076 SET @CurrentBackupType = 'FULL'
2077 END
2078 END
2079
2080 IF DATABASEPROPERTYEX(@CurrentDatabaseName,'Status') = 'ONLINE' AND @Version >= 13.05026
2081 BEGIN
2082 SELECT @CurrentLastLogBackup = log_backup_time,
2083 @CurrentLogSizeSinceLastLogBackup = log_since_last_log_backup_mb
2084 FROM sys.dm_db_log_stats (@CurrentDatabaseID)
2085 END
2086
2087 IF @CurrentBackupType = 'DIFF'
2088 BEGIN
2089 SELECT @CurrentDifferentialBaseIsSnapshot = is_snapshot
2090 FROM msdb.dbo.backupset
2091 WHERE database_name = @CurrentDatabaseName
2092 AND [type] = 'D'
2093 AND checkpoint_lsn = @CurrentDifferentialBaseLSN
2094 END
2095
2096 SELECT @CurrentDatabaseMirroringRole = UPPER(mirroring_role_desc)
2097 FROM sys.database_mirroring
2098 WHERE database_id = @CurrentDatabaseID
2099
2100 IF EXISTS (SELECT * FROM msdb.dbo.log_shipping_primary_databases WHERE primary_database = @CurrentDatabaseName)
2101 BEGIN
2102 SET @CurrentLogShippingRole = 'PRIMARY'
2103 END
2104 ELSE
2105 IF EXISTS (SELECT * FROM msdb.dbo.log_shipping_secondary_databases WHERE secondary_database = @CurrentDatabaseName)
2106 BEGIN
2107 SET @CurrentLogShippingRole = 'SECONDARY'
2108 END
2109
2110 SELECT @CurrentIsReadOnly = is_read_only
2111 FROM sys.databases
2112 WHERE name = @CurrentDatabaseName
2113
2114 IF @Version >= 10
2115 BEGIN
2116 SET @CurrentCommand06 = 'SELECT @ParamIsEncrypted = is_encrypted FROM sys.databases WHERE name = @ParamDatabaseName'
2117
2118 EXECUTE sp_executesql @statement = @CurrentCommand06, @params = N'@ParamDatabaseName nvarchar(max), @ParamIsEncrypted bit OUTPUT', @ParamDatabaseName = @CurrentDatabaseName, @ParamIsEncrypted = @CurrentIsEncrypted OUTPUT
2119 END
2120
2121 SET @DatabaseMessage = 'Date and time: ' + CONVERT(nvarchar,GETDATE(),120)
2122 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
2123
2124 SET @DatabaseMessage = 'Database: ' + QUOTENAME(@CurrentDatabaseName)
2125 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
2126
2127 SET @DatabaseMessage = 'Status: ' + CAST(DATABASEPROPERTYEX(@CurrentDatabaseName,'Status') AS nvarchar)
2128 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
2129
2130 SET @DatabaseMessage = 'Standby: ' + CASE WHEN DATABASEPROPERTYEX(@CurrentDatabaseName,'IsInStandBy') = 1 THEN 'Yes' ELSE 'No' END
2131 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
2132
2133 SET @DatabaseMessage = 'Updateability: ' + CASE WHEN @CurrentIsReadOnly = 1 THEN 'READ_ONLY' WHEN @CurrentIsReadOnly = 0 THEN 'READ_WRITE' END
2134 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
2135
2136 SET @DatabaseMessage = 'User access: ' + CAST(DATABASEPROPERTYEX(@CurrentDatabaseName,'UserAccess') AS nvarchar)
2137 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
2138
2139 IF @CurrentIsDatabaseAccessible IS NOT NULL
2140 BEGIN
2141 SET @DatabaseMessage = 'Is accessible: ' + CASE WHEN @CurrentIsDatabaseAccessible = 1 THEN 'Yes' ELSE 'No' END
2142 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
2143 END
2144
2145 SET @DatabaseMessage = 'Recovery model: ' + CAST(DATABASEPROPERTYEX(@CurrentDatabaseName,'Recovery') AS nvarchar)
2146 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
2147
2148 SET @DatabaseMessage = 'Encrypted: ' + CASE WHEN @CurrentIsEncrypted = 1 THEN 'Yes' WHEN @CurrentIsEncrypted = 0 THEN 'No' ELSE 'N/A' END
2149 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
2150
2151 IF @CurrentAvailabilityGroup IS NOT NULL
2152 BEGIN
2153 SET @DatabaseMessage = 'Availability group: ' + @CurrentAvailabilityGroup
2154 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
2155
2156 SET @DatabaseMessage = 'Availability group role: ' + @CurrentAvailabilityGroupRole
2157 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
2158
2159 SET @DatabaseMessage = 'Availability group backup preference: ' + @CurrentAvailabilityGroupBackupPreference
2160 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
2161
2162 SET @DatabaseMessage = 'Is preferred backup replica: ' + CASE WHEN @CurrentIsPreferredBackupReplica = 1 THEN 'Yes' WHEN @CurrentIsPreferredBackupReplica = 0 THEN 'No' ELSE 'N/A' END
2163 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
2164 END
2165
2166 IF @CurrentDatabaseMirroringRole IS NOT NULL
2167 BEGIN
2168 SET @DatabaseMessage = 'Database mirroring role: ' + @CurrentDatabaseMirroringRole
2169 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
2170 END
2171
2172 IF @CurrentLogShippingRole IS NOT NULL
2173 BEGIN
2174 SET @DatabaseMessage = 'Log shipping role: ' + @CurrentLogShippingRole
2175 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
2176 END
2177
2178 SET @DatabaseMessage = 'Differential base LSN: ' + ISNULL(CAST(@CurrentDifferentialBaseLSN AS nvarchar),'N/A')
2179 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
2180
2181 IF @CurrentBackupType = 'DIFF'
2182 BEGIN
2183 SET @DatabaseMessage = 'Differential base is snapshot: ' + CASE WHEN @CurrentDifferentialBaseIsSnapshot = 1 THEN 'Yes' WHEN @CurrentDifferentialBaseIsSnapshot = 0 THEN 'No' ELSE 'N/A' END
2184 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
2185 END
2186
2187 SET @DatabaseMessage = 'Last log backup LSN: ' + ISNULL(CAST(@CurrentLogLSN AS nvarchar),'N/A')
2188 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
2189
2190 IF @CurrentBackupType IN('DIFF','FULL') AND @Version >= 13.05026
2191 BEGIN
2192 SET @DatabaseMessage = 'Allocated extent page count: ' + ISNULL(CAST(@CurrentAllocatedExtentPageCount AS nvarchar),'N/A')
2193 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
2194
2195 SET @DatabaseMessage = 'Modified extent page count: ' + ISNULL(CAST(@CurrentModifiedExtentPageCount AS nvarchar),'N/A')
2196 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
2197 END
2198
2199 IF @CurrentBackupType = 'LOG' AND @Version >= 13.05026
2200 BEGIN
2201 SET @DatabaseMessage = 'Last log backup: ' + ISNULL(CONVERT(nvarchar(19),@CurrentLastLogBackup,120),'N/A')
2202 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
2203
2204 SET @DatabaseMessage = 'Log size since last log backup (MB): ' + ISNULL(CAST(@CurrentLogSizeSinceLastLogBackup AS nvarchar),'N/A')
2205 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
2206 END
2207
2208 RAISERROR('',10,1) WITH NOWAIT
2209
2210 IF DATABASEPROPERTYEX(@CurrentDatabaseName,'Status') = 'ONLINE'
2211 AND (@CurrentIsDatabaseAccessible = 1 OR @CurrentIsDatabaseAccessible IS NULL)
2212 AND DATABASEPROPERTYEX(@CurrentDatabaseName,'IsInStandBy') = 0
2213 AND NOT (@CurrentBackupType = 'LOG' AND (DATABASEPROPERTYEX(@CurrentDatabaseName,'Recovery') = 'SIMPLE' OR @CurrentLogLSN IS NULL))
2214 AND NOT (@CurrentBackupType = 'DIFF' AND @CurrentDifferentialBaseLSN IS NULL)
2215 AND NOT (@CurrentBackupType IN('DIFF','LOG') AND @CurrentDatabaseName = 'master')
2216 AND NOT (@CurrentAvailabilityGroup IS NOT NULL AND @CurrentBackupType = 'FULL' AND @CopyOnly = 'N' AND (@CurrentAvailabilityGroupRole <> 'PRIMARY' OR @CurrentAvailabilityGroupRole IS NULL))
2217 AND NOT (@CurrentAvailabilityGroup IS NOT NULL AND @CurrentBackupType = 'FULL' AND @CopyOnly = 'Y' AND (@CurrentIsPreferredBackupReplica <> 1 OR @CurrentIsPreferredBackupReplica IS NULL) AND @OverrideBackupPreference = 'N')
2218 AND NOT (@CurrentAvailabilityGroup IS NOT NULL AND @CurrentBackupType = 'DIFF' AND (@CurrentAvailabilityGroupRole <> 'PRIMARY' OR @CurrentAvailabilityGroupRole IS NULL))
2219 AND NOT (@CurrentAvailabilityGroup IS NOT NULL AND @CurrentBackupType = 'LOG' AND @CopyOnly = 'N' AND (@CurrentIsPreferredBackupReplica <> 1 OR @CurrentIsPreferredBackupReplica IS NULL) AND @OverrideBackupPreference = 'N')
2220 AND NOT (@CurrentAvailabilityGroup IS NOT NULL AND @CurrentBackupType = 'LOG' AND @CopyOnly = 'Y' AND (@CurrentAvailabilityGroupRole <> 'PRIMARY' OR @CurrentAvailabilityGroupRole IS NULL))
2221 AND NOT ((@CurrentLogShippingRole = 'PRIMARY' AND @CurrentLogShippingRole IS NOT NULL) AND @CurrentBackupType = 'LOG')
2222 AND NOT (@CurrentIsReadOnly = 1 AND @Updateability = 'READ_WRITE')
2223 AND NOT (@CurrentIsReadOnly = 0 AND @Updateability = 'READ_ONLY')
2224 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))
2225 BEGIN
2226
2227 IF @CurrentBackupType = 'LOG' AND (@CleanupTime IS NOT NULL OR @MirrorCleanupTime IS NOT NULL)
2228 BEGIN
2229 SELECT @CurrentLatestBackup = MAX(backup_finish_date)
2230 FROM msdb.dbo.backupset
2231 WHERE ([type] IN('D','I')
2232 OR database_backup_lsn < @CurrentDifferentialBaseLSN)
2233 AND is_damaged = 0
2234 AND database_name = @CurrentDatabaseName
2235 END
2236
2237 SET @CurrentDate = GETDATE()
2238
2239 INSERT INTO @CurrentCleanupDates (CleanupDate)
2240 SELECT @CurrentDate
2241
2242 IF @CurrentBackupType = 'LOG'
2243 BEGIN
2244 INSERT INTO @CurrentCleanupDates (CleanupDate)
2245 SELECT @CurrentLatestBackup
2246 END
2247
2248 SELECT @CurrentDirectoryStructure = CASE
2249 WHEN @CurrentAvailabilityGroup IS NOT NULL THEN @AvailabilityGroupDirectoryStructure
2250 ELSE @DirectoryStructure
2251 END
2252
2253 IF @CurrentDirectoryStructure IS NOT NULL
2254 BEGIN
2255 -- Directory structure - remove tokens that are not needed
2256 IF @ReadWriteFileGroups = 'N' SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{Partial}','')
2257 IF @CopyOnly = 'N' SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{CopyOnly}','')
2258 IF @Cluster IS NULL SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{ClusterName}','')
2259 IF @CurrentAvailabilityGroup IS NULL SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{AvailabilityGroupName}','')
2260 IF SERVERPROPERTY('InstanceName') IS NULL SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{InstanceName}','')
2261 IF @@SERVICENAME IS NULL SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{ServiceName}','')
2262 IF @Description IS NULL SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{Description}','')
2263
2264 IF @Directory IS NULL AND @MirrorDirectory IS NULL AND @URL IS NULL AND @DefaultDirectory LIKE '%' + '.' + @@SERVICENAME + @DirectorySeparator + 'MSSQL' + @DirectorySeparator + 'Backup'
2265 BEGIN
2266 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{ServerName}','')
2267 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{InstanceName}','')
2268 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{ClusterName}','')
2269 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{AvailabilityGroupName}','')
2270 END
2271
2272 WHILE (@Updated = 1 OR @Updated IS NULL)
2273 BEGIN
2274 SET @Updated = 0
2275
2276 IF CHARINDEX('\',@CurrentDirectoryStructure) > 0
2277 BEGIN
2278 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'\','{DirectorySeparator}')
2279 SET @Updated = 1
2280 END
2281
2282 IF CHARINDEX('/',@CurrentDirectoryStructure) > 0
2283 BEGIN
2284 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'/','{DirectorySeparator}')
2285 SET @Updated = 1
2286 END
2287
2288 IF CHARINDEX('__',@CurrentDirectoryStructure) > 0
2289 BEGIN
2290 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'__','_')
2291 SET @Updated = 1
2292 END
2293
2294 IF CHARINDEX('--',@CurrentDirectoryStructure) > 0
2295 BEGIN
2296 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'--','-')
2297 SET @Updated = 1
2298 END
2299
2300 IF CHARINDEX('{DirectorySeparator}{DirectorySeparator}',@CurrentDirectoryStructure) > 0
2301 BEGIN
2302 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{DirectorySeparator}{DirectorySeparator}','{DirectorySeparator}')
2303 SET @Updated = 1
2304 END
2305
2306 IF CHARINDEX('{DirectorySeparator}$',@CurrentDirectoryStructure) > 0
2307 BEGIN
2308 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{DirectorySeparator}$','{DirectorySeparator}')
2309 SET @Updated = 1
2310 END
2311 IF CHARINDEX('${DirectorySeparator}',@CurrentDirectoryStructure) > 0
2312 BEGIN
2313 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'${DirectorySeparator}','{DirectorySeparator}')
2314 SET @Updated = 1
2315 END
2316
2317 IF CHARINDEX('{DirectorySeparator}_',@CurrentDirectoryStructure) > 0
2318 BEGIN
2319 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{DirectorySeparator}_','{DirectorySeparator}')
2320 SET @Updated = 1
2321 END
2322 IF CHARINDEX('_{DirectorySeparator}',@CurrentDirectoryStructure) > 0
2323 BEGIN
2324 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'_{DirectorySeparator}','{DirectorySeparator}')
2325 SET @Updated = 1
2326 END
2327
2328 IF CHARINDEX('{DirectorySeparator}-',@CurrentDirectoryStructure) > 0
2329 BEGIN
2330 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{DirectorySeparator}-','{DirectorySeparator}')
2331 SET @Updated = 1
2332 END
2333 IF CHARINDEX('-{DirectorySeparator}',@CurrentDirectoryStructure) > 0
2334 BEGIN
2335 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'-{DirectorySeparator}','{DirectorySeparator}')
2336 SET @Updated = 1
2337 END
2338
2339 IF CHARINDEX('_$',@CurrentDirectoryStructure) > 0
2340 BEGIN
2341 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'_$','_')
2342 SET @Updated = 1
2343 END
2344 IF CHARINDEX('$_',@CurrentDirectoryStructure) > 0
2345 BEGIN
2346 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'$_','_')
2347 SET @Updated = 1
2348 END
2349
2350 IF CHARINDEX('-$',@CurrentDirectoryStructure) > 0
2351 BEGIN
2352 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'-$','-')
2353 SET @Updated = 1
2354 END
2355 IF CHARINDEX('$-',@CurrentDirectoryStructure) > 0
2356 BEGIN
2357 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'$-','-')
2358 SET @Updated = 1
2359 END
2360
2361 IF LEFT(@CurrentDirectoryStructure,1) = '_'
2362 BEGIN
2363 SET @CurrentDirectoryStructure = RIGHT(@CurrentDirectoryStructure,LEN(@CurrentDirectoryStructure) - 1)
2364 SET @Updated = 1
2365 END
2366 IF RIGHT(@CurrentDirectoryStructure,1) = '_'
2367 BEGIN
2368 SET @CurrentDirectoryStructure = LEFT(@CurrentDirectoryStructure,LEN(@CurrentDirectoryStructure) - 1)
2369 SET @Updated = 1
2370 END
2371
2372 IF LEFT(@CurrentDirectoryStructure,1) = '-'
2373 BEGIN
2374 SET @CurrentDirectoryStructure = RIGHT(@CurrentDirectoryStructure,LEN(@CurrentDirectoryStructure) - 1)
2375 SET @Updated = 1
2376 END
2377 IF RIGHT(@CurrentDirectoryStructure,1) = '-'
2378 BEGIN
2379 SET @CurrentDirectoryStructure = LEFT(@CurrentDirectoryStructure,LEN(@CurrentDirectoryStructure) - 1)
2380 SET @Updated = 1
2381 END
2382
2383 IF LEFT(@CurrentDirectoryStructure,1) = '$'
2384 BEGIN
2385 SET @CurrentDirectoryStructure = RIGHT(@CurrentDirectoryStructure,LEN(@CurrentDirectoryStructure) - 1)
2386 SET @Updated = 1
2387 END
2388 IF RIGHT(@CurrentDirectoryStructure,1) = '$'
2389 BEGIN
2390 SET @CurrentDirectoryStructure = LEFT(@CurrentDirectoryStructure,LEN(@CurrentDirectoryStructure) - 1)
2391 SET @Updated = 1
2392 END
2393
2394 IF LEFT(@CurrentDirectoryStructure,20) = '{DirectorySeparator}'
2395 BEGIN
2396 SET @CurrentDirectoryStructure = RIGHT(@CurrentDirectoryStructure,LEN(@CurrentDirectoryStructure) - 20)
2397 SET @Updated = 1
2398 END
2399 IF RIGHT(@CurrentDirectoryStructure,20) = '{DirectorySeparator}'
2400 BEGIN
2401 SET @CurrentDirectoryStructure = LEFT(@CurrentDirectoryStructure,LEN(@CurrentDirectoryStructure) - 20)
2402 SET @Updated = 1
2403 END
2404 END
2405
2406 SET @Updated = NULL
2407
2408 -- Directory structure - replace tokens with real values
2409 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{DirectorySeparator}',@DirectorySeparator)
2410 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)
2411 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{InstanceName}',ISNULL(CAST(SERVERPROPERTY('InstanceName') AS nvarchar(max)),''))
2412 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{ServiceName}',ISNULL(@@SERVICENAME,''))
2413 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{ClusterName}',ISNULL(@Cluster,''))
2414 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{AvailabilityGroupName}',ISNULL(@CurrentAvailabilityGroup,''))
2415 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{DatabaseName}',@CurrentDatabaseNameFS)
2416 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{BackupType}',@CurrentBackupType)
2417 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{Partial}','PARTIAL')
2418 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{CopyOnly}','COPY_ONLY')
2419 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{Description}',LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(ISNULL(@Description,''),'\',''),'/',''),':',''),'*',''),'?',''),'"',''),'<',''),'>',''),'|',''))))
2420 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{Year}',CAST(DATEPART(YEAR,@CurrentDate) AS nvarchar))
2421 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{Month}',RIGHT('0' + CAST(DATEPART(MONTH,@CurrentDate) AS nvarchar),2))
2422 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{Day}',RIGHT('0' + CAST(DATEPART(DAY,@CurrentDate) AS nvarchar),2))
2423 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{Hour}',RIGHT('0' + CAST(DATEPART(HOUR,@CurrentDate) AS nvarchar),2))
2424 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{Minute}',RIGHT('0' + CAST(DATEPART(MINUTE,@CurrentDate) AS nvarchar),2))
2425 SET @CurrentDirectoryStructure = REPLACE(@CurrentDirectoryStructure,'{Second}',RIGHT('0' + CAST(DATEPART(SECOND,@CurrentDate) AS nvarchar),2))
2426 END
2427
2428 INSERT INTO @CurrentDirectories (ID, DirectoryPath, Mirror, DirectoryNumber, CreateCompleted, CleanupCompleted)
2429 SELECT ROW_NUMBER() OVER (ORDER BY ID),
2430 DirectoryPath + CASE WHEN @CurrentDirectoryStructure IS NOT NULL THEN @DirectorySeparator + @CurrentDirectoryStructure ELSE '' END,
2431 Mirror,
2432 ROW_NUMBER() OVER (PARTITION BY Mirror ORDER BY ID ASC),
2433 0,
2434 0
2435 FROM @Directories
2436 ORDER BY ID ASC
2437
2438 INSERT INTO @CurrentURLs (ID, DirectoryPath, Mirror)
2439 SELECT ROW_NUMBER() OVER (ORDER BY ID),
2440 DirectoryPath + CASE WHEN @CurrentDirectoryStructure IS NOT NULL THEN @DirectorySeparator + @CurrentDirectoryStructure ELSE '' END,
2441 Mirror
2442 FROM @URLs
2443 ORDER BY ID ASC
2444
2445 SELECT @CurrentDatabaseFileName = CASE
2446 WHEN @CurrentAvailabilityGroup IS NOT NULL THEN @AvailabilityGroupFileName
2447 ELSE @FileName
2448 END
2449
2450 -- File name - remove tokens that are not needed
2451 IF @ReadWriteFileGroups = 'N' SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{Partial}','')
2452 IF @CopyOnly = 'N' SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{CopyOnly}','')
2453 IF @Cluster IS NULL SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{ClusterName}','')
2454 IF @CurrentAvailabilityGroup IS NULL SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{AvailabilityGroupName}','')
2455 IF SERVERPROPERTY('InstanceName') IS NULL SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{InstanceName}','')
2456 IF @@SERVICENAME IS NULL SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{ServiceName}','')
2457 IF @Description IS NULL SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{Description}','')
2458 IF @NumberOfFiles = 1 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{FileNumber}','')
2459
2460 WHILE (@Updated = 1 OR @Updated IS NULL)
2461 BEGIN
2462 SET @Updated = 0
2463
2464 IF CHARINDEX('__',@CurrentDatabaseFileName) > 0
2465 BEGIN
2466 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'__','_')
2467 SET @Updated = 1
2468 END
2469
2470 IF CHARINDEX('--',@CurrentDatabaseFileName) > 0
2471 BEGIN
2472 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'--','-')
2473 SET @Updated = 1
2474 END
2475
2476 IF CHARINDEX('_$',@CurrentDatabaseFileName) > 0
2477 BEGIN
2478 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'_$','_')
2479 SET @Updated = 1
2480 END
2481 IF CHARINDEX('$_',@CurrentDatabaseFileName) > 0
2482 BEGIN
2483 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'$_','_')
2484 SET @Updated = 1
2485 END
2486
2487 IF CHARINDEX('-$',@CurrentDatabaseFileName) > 0
2488 BEGIN
2489 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'-$','-')
2490 SET @Updated = 1
2491 END
2492 IF CHARINDEX('$-',@CurrentDatabaseFileName) > 0
2493 BEGIN
2494 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'$-','-')
2495 SET @Updated = 1
2496 END
2497
2498 IF CHARINDEX('_.',@CurrentDatabaseFileName) > 0
2499 BEGIN
2500 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'_.','.')
2501 SET @Updated = 1
2502 END
2503
2504 IF CHARINDEX('-.',@CurrentDatabaseFileName) > 0
2505 BEGIN
2506 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'-.','.')
2507 SET @Updated = 1
2508 END
2509
2510 IF LEFT(@CurrentDatabaseFileName,1) = '_'
2511 BEGIN
2512 SET @CurrentDatabaseFileName = RIGHT(@CurrentDatabaseFileName,LEN(@CurrentDatabaseFileName) - 1)
2513 SET @Updated = 1
2514 END
2515 IF RIGHT(@CurrentDatabaseFileName,1) = '_'
2516 BEGIN
2517 SET @CurrentDatabaseFileName = LEFT(@CurrentDatabaseFileName,LEN(@CurrentDatabaseFileName) - 1)
2518 SET @Updated = 1
2519 END
2520
2521 IF LEFT(@CurrentDatabaseFileName,1) = '-'
2522 BEGIN
2523 SET @CurrentDatabaseFileName = RIGHT(@CurrentDatabaseFileName,LEN(@CurrentDatabaseFileName) - 1)
2524 SET @Updated = 1
2525 END
2526 IF RIGHT(@CurrentDatabaseFileName,1) = '-'
2527 BEGIN
2528 SET @CurrentDatabaseFileName = LEFT(@CurrentDatabaseFileName,LEN(@CurrentDatabaseFileName) - 1)
2529 SET @Updated = 1
2530 END
2531
2532 IF LEFT(@CurrentDatabaseFileName,1) = '$'
2533 BEGIN
2534 SET @CurrentDatabaseFileName = RIGHT(@CurrentDatabaseFileName,LEN(@CurrentDatabaseFileName) - 1)
2535 SET @Updated = 1
2536 END
2537 IF RIGHT(@CurrentDatabaseFileName,1) = '$'
2538 BEGIN
2539 SET @CurrentDatabaseFileName = LEFT(@CurrentDatabaseFileName,LEN(@CurrentDatabaseFileName) - 1)
2540 SET @Updated = 1
2541 END
2542 END
2543
2544 SET @Updated = NULL
2545
2546 SELECT @CurrentFileExtension = CASE
2547 WHEN @CurrentBackupType = 'FULL' THEN @FileExtensionFull
2548 WHEN @CurrentBackupType = 'DIFF' THEN @FileExtensionDiff
2549 WHEN @CurrentBackupType = 'LOG' THEN @FileExtensionLog
2550 END
2551
2552 -- File name - replace tokens with real values
2553 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)
2554 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{InstanceName}',ISNULL(CAST(SERVERPROPERTY('InstanceName') AS nvarchar(max)),''))
2555 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{ServiceName}',ISNULL(@@SERVICENAME,''))
2556 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{ClusterName}',ISNULL(@Cluster,''))
2557 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{AvailabilityGroupName}',ISNULL(@CurrentAvailabilityGroup,''))
2558 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{BackupType}',@CurrentBackupType)
2559 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{Partial}','PARTIAL')
2560 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{CopyOnly}','COPY_ONLY')
2561 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{Description}',LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(ISNULL(@Description,''),'\',''),'/',''),':',''),'*',''),'?',''),'"',''),'<',''),'>',''),'|',''))))
2562 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{Year}',CAST(DATEPART(YEAR,@CurrentDate) AS nvarchar))
2563 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{Month}',RIGHT('0' + CAST(DATEPART(MONTH,@CurrentDate) AS nvarchar),2))
2564 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{Day}',RIGHT('0' + CAST(DATEPART(DAY,@CurrentDate) AS nvarchar),2))
2565 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{Hour}',RIGHT('0' + CAST(DATEPART(HOUR,@CurrentDate) AS nvarchar),2))
2566 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{Minute}',RIGHT('0' + CAST(DATEPART(MINUTE,@CurrentDate) AS nvarchar),2))
2567 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{Second}',RIGHT('0' + CAST(DATEPART(SECOND,@CurrentDate) AS nvarchar),2))
2568 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{FileExtension}',@CurrentFileExtension)
2569
2570 SELECT @CurrentMaxFilePathLength = CASE
2571 WHEN EXISTS (SELECT * FROM @CurrentDirectories) THEN (SELECT MAX(LEN(DirectoryPath + @DirectorySeparator)) FROM @CurrentDirectories)
2572 WHEN EXISTS (SELECT * FROM @CurrentURLs) THEN (SELECT MAX(LEN(DirectoryPath + @DirectorySeparator)) FROM @CurrentURLs)
2573 END
2574 + LEN(REPLACE(REPLACE(@CurrentDatabaseFileName,'{DatabaseName}',@CurrentDatabaseNameFS), '{FileNumber}', CASE WHEN @NumberOfFiles > 1 AND @NumberOfFiles <= 9 THEN '1' WHEN @NumberOfFiles >= 10 THEN '01' ELSE '' END))
2575
2576 -- The maximum length of a backup device is 259 characters
2577 IF @CurrentMaxFilePathLength > 259
2578 BEGIN
2579 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{DatabaseName}',LEFT(@CurrentDatabaseNameFS,CASE WHEN (LEN(@CurrentDatabaseNameFS) + 259 - @CurrentMaxFilePathLength - 3) < 20 THEN 20 ELSE (LEN(@CurrentDatabaseNameFS) + 259 - @CurrentMaxFilePathLength - 3) END) + '...')
2580 END
2581 ELSE
2582 BEGIN
2583 SET @CurrentDatabaseFileName = REPLACE(@CurrentDatabaseFileName,'{DatabaseName}',@CurrentDatabaseNameFS)
2584 END
2585
2586 IF EXISTS (SELECT * FROM @CurrentDirectories WHERE Mirror = 0)
2587 BEGIN
2588 SET @CurrentFileNumber = 0
2589
2590 WHILE @CurrentFileNumber < @NumberOfFiles
2591 BEGIN
2592 SET @CurrentFileNumber = @CurrentFileNumber + 1
2593
2594 SELECT @CurrentDirectoryPath = DirectoryPath
2595 FROM @CurrentDirectories
2596 WHERE @CurrentFileNumber >= (DirectoryNumber - 1) * (SELECT @NumberOfFiles / COUNT(*) FROM @CurrentDirectories WHERE Mirror = 0) + 1
2597 AND @CurrentFileNumber <= DirectoryNumber * (SELECT @NumberOfFiles / COUNT(*) FROM @CurrentDirectories WHERE Mirror = 0)
2598 AND Mirror = 0
2599
2600 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)
2601
2602 SET @CurrentFilePath = @CurrentDirectoryPath + @DirectorySeparator + @CurrentFileName
2603
2604 INSERT INTO @CurrentFiles ([Type], FilePath, Mirror)
2605 SELECT 'DISK', @CurrentFilePath, 0
2606
2607 SET @CurrentDirectoryPath = NULL
2608 SET @CurrentFileName = NULL
2609 SET @CurrentFilePath = NULL
2610 END
2611
2612 INSERT INTO @CurrentBackupSet (Mirror, VerifyCompleted)
2613 SELECT 0, 0
2614 END
2615
2616 IF EXISTS (SELECT * FROM @CurrentDirectories WHERE Mirror = 1)
2617 BEGIN
2618 SET @CurrentFileNumber = 0
2619
2620 WHILE @CurrentFileNumber < @NumberOfFiles
2621 BEGIN
2622 SET @CurrentFileNumber = @CurrentFileNumber + 1
2623
2624 SELECT @CurrentDirectoryPath = DirectoryPath
2625 FROM @CurrentDirectories
2626 WHERE @CurrentFileNumber >= (DirectoryNumber - 1) * (SELECT @NumberOfFiles / COUNT(*) FROM @CurrentDirectories WHERE Mirror = 1) + 1
2627 AND @CurrentFileNumber <= DirectoryNumber * (SELECT @NumberOfFiles / COUNT(*) FROM @CurrentDirectories WHERE Mirror = 1)
2628 AND Mirror = 1
2629
2630 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)
2631
2632 SET @CurrentFilePath = @CurrentDirectoryPath + @DirectorySeparator + @CurrentFileName
2633
2634 INSERT INTO @CurrentFiles ([Type], FilePath, Mirror)
2635 SELECT 'DISK', @CurrentFilePath, 1
2636
2637 SET @CurrentDirectoryPath = NULL
2638 SET @CurrentFileName = NULL
2639 SET @CurrentFilePath = NULL
2640 END
2641
2642 INSERT INTO @CurrentBackupSet (Mirror, VerifyCompleted)
2643 SELECT 1, 0
2644 END
2645
2646 IF EXISTS (SELECT * FROM @CurrentURLs WHERE Mirror = 0)
2647 BEGIN
2648 SET @CurrentFileNumber = 0
2649
2650 WHILE @CurrentFileNumber < @NumberOfFiles
2651 BEGIN
2652 SET @CurrentFileNumber = @CurrentFileNumber + 1
2653
2654 SELECT @CurrentDirectoryPath = DirectoryPath
2655 FROM @CurrentURLs
2656 WHERE Mirror = 0
2657
2658 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)
2659
2660 SET @CurrentFilePath = @CurrentDirectoryPath + @DirectorySeparator + @CurrentFileName
2661
2662 INSERT INTO @CurrentFiles ([Type], FilePath, Mirror)
2663 SELECT 'URL', @CurrentFilePath, 0
2664
2665 SET @CurrentDirectoryPath = NULL
2666 SET @CurrentFileName = NULL
2667 SET @CurrentFilePath = NULL
2668 END
2669
2670 INSERT INTO @CurrentBackupSet (Mirror, VerifyCompleted)
2671 SELECT 0, 0
2672 END
2673
2674 IF EXISTS (SELECT * FROM @CurrentURLs WHERE Mirror = 1)
2675 BEGIN
2676 SET @CurrentFileNumber = 0
2677
2678 WHILE @CurrentFileNumber < @NumberOfFiles
2679 BEGIN
2680 SET @CurrentFileNumber = @CurrentFileNumber + 1
2681
2682 SELECT @CurrentDirectoryPath = DirectoryPath
2683 FROM @CurrentURLs
2684 WHERE Mirror = 1
2685
2686 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)
2687
2688 SET @CurrentFilePath = @CurrentDirectoryPath + @DirectorySeparator + @CurrentFileName
2689
2690 INSERT INTO @CurrentFiles ([Type], FilePath, Mirror)
2691 SELECT 'URL', @CurrentFilePath, 1
2692
2693 SET @CurrentDirectoryPath = NULL
2694 SET @CurrentFileName = NULL
2695 SET @CurrentFilePath = NULL
2696 END
2697
2698 INSERT INTO @CurrentBackupSet (Mirror, VerifyCompleted)
2699 SELECT 1, 0
2700 END
2701
2702 -- Create directory
2703 IF @HostPlatform = 'Windows'
2704 AND (@BackupSoftware <> 'DATA_DOMAIN_BOOST' OR @BackupSoftware IS NULL)
2705 BEGIN
2706 WHILE (1 = 1)
2707 BEGIN
2708 SELECT TOP 1 @CurrentDirectoryID = ID,
2709 @CurrentDirectoryPath = DirectoryPath
2710 FROM @CurrentDirectories
2711 WHERE CreateCompleted = 0
2712 ORDER BY ID ASC
2713
2714 IF @@ROWCOUNT = 0
2715 BEGIN
2716 BREAK
2717 END
2718
2719 SET @CurrentCommandType01 = 'xp_create_subdir'
2720 SET @CurrentCommand01 = 'DECLARE @ReturnCode int EXECUTE @ReturnCode = [master].dbo.xp_create_subdir N''' + REPLACE(@CurrentDirectoryPath,'''','''''') + ''' IF @ReturnCode <> 0 RAISERROR(''Error creating directory.'', 16, 1)'
2721 EXECUTE @CurrentCommandOutput01 = [dbo].[CommandExecute] @Command = @CurrentCommand01, @CommandType = @CurrentCommandType01, @Mode = 1, @DatabaseName = @CurrentDatabaseName, @LogToTable = @LogToTable, @Execute = @Execute
2722 SET @Error = @@ERROR
2723 IF @Error <> 0 SET @CurrentCommandOutput01 = @Error
2724 IF @CurrentCommandOutput01 <> 0 SET @ReturnCode = @CurrentCommandOutput01
2725
2726 UPDATE @CurrentDirectories
2727 SET CreateCompleted = 1,
2728 CreateOutput = @CurrentCommandOutput01
2729 WHERE ID = @CurrentDirectoryID
2730
2731 SET @CurrentDirectoryID = NULL
2732 SET @CurrentDirectoryPath = NULL
2733
2734 SET @CurrentCommand01 = NULL
2735
2736 SET @CurrentCommandOutput01 = NULL
2737
2738 SET @CurrentCommandType01 = NULL
2739 END
2740 END
2741
2742 IF @CleanupMode = 'BEFORE_BACKUP'
2743 BEGIN
2744 INSERT INTO @CurrentCleanupDates (CleanupDate, Mirror)
2745 SELECT DATEADD(hh,-(@CleanupTime),GETDATE()), 0
2746
2747 IF NOT EXISTS(SELECT * FROM @CurrentCleanupDates WHERE (Mirror = 0 OR Mirror IS NULL) AND CleanupDate IS NULL)
2748 BEGIN
2749 UPDATE @CurrentDirectories
2750 SET CleanupDate = (SELECT MIN(CleanupDate)
2751 FROM @CurrentCleanupDates
2752 WHERE (Mirror = 0 OR Mirror IS NULL)),
2753 CleanupMode = 'BEFORE_BACKUP'
2754 WHERE Mirror = 0
2755 END
2756 END
2757
2758 IF @MirrorCleanupMode = 'BEFORE_BACKUP'
2759 BEGIN
2760 INSERT INTO @CurrentCleanupDates (CleanupDate, Mirror)
2761 SELECT DATEADD(hh,-(@MirrorCleanupTime),GETDATE()), 1
2762
2763 IF NOT EXISTS(SELECT * FROM @CurrentCleanupDates WHERE (Mirror = 1 OR Mirror IS NULL) AND CleanupDate IS NULL)
2764 BEGIN
2765 UPDATE @CurrentDirectories
2766 SET CleanupDate = (SELECT MIN(CleanupDate)
2767 FROM @CurrentCleanupDates
2768 WHERE (Mirror = 1 OR Mirror IS NULL)),
2769 CleanupMode = 'BEFORE_BACKUP'
2770 WHERE Mirror = 1
2771 END
2772 END
2773
2774 -- Delete old backup files, before backup
2775 IF NOT EXISTS (SELECT * FROM @CurrentDirectories WHERE CreateOutput <> 0 OR CreateOutput IS NULL)
2776 AND @HostPlatform = 'Windows'
2777 AND (@BackupSoftware <> 'DATA_DOMAIN_BOOST' OR @BackupSoftware IS NULL)
2778 AND @CurrentBackupType = @BackupType
2779 BEGIN
2780 WHILE (1 = 1)
2781 BEGIN
2782 SELECT TOP 1 @CurrentDirectoryID = ID,
2783 @CurrentDirectoryPath = DirectoryPath,
2784 @CurrentCleanupDate = CleanupDate
2785 FROM @CurrentDirectories
2786 WHERE CleanupDate IS NOT NULL
2787 AND CleanupMode = 'BEFORE_BACKUP'
2788 AND CleanupCompleted = 0
2789 ORDER BY ID ASC
2790
2791 IF @@ROWCOUNT = 0
2792 BEGIN
2793 BREAK
2794 END
2795
2796 IF @BackupSoftware IS NULL
2797 BEGIN
2798 SET @CurrentCommandType02 = 'xp_delete_file'
2799
2800 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)'
2801 END
2802
2803 IF @BackupSoftware = 'LITESPEED'
2804 BEGIN
2805 SET @CurrentCommandType02 = 'xp_slssqlmaint'
2806
2807 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)'
2808 END
2809
2810 IF @BackupSoftware = 'SQLBACKUP'
2811 BEGIN
2812 SET @CurrentCommandType02 = 'sqbutility'
2813
2814 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)'
2815 END
2816
2817 IF @BackupSoftware = 'SQLSAFE'
2818 BEGIN
2819 SET @CurrentCommandType02 = 'xp_ss_delete'
2820
2821 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)'
2822 END
2823
2824 EXECUTE @CurrentCommandOutput02 = [dbo].[CommandExecute] @Command = @CurrentCommand02, @CommandType = @CurrentCommandType02, @Mode = 1, @DatabaseName = @CurrentDatabaseName, @LogToTable = @LogToTable, @Execute = @Execute
2825 SET @Error = @@ERROR
2826 IF @Error <> 0 SET @CurrentCommandOutput02 = @Error
2827 IF @CurrentCommandOutput02 <> 0 SET @ReturnCode = @CurrentCommandOutput02
2828
2829 UPDATE @CurrentDirectories
2830 SET CleanupCompleted = 1,
2831 CleanupOutput = @CurrentCommandOutput02
2832 WHERE ID = @CurrentDirectoryID
2833
2834 SET @CurrentDirectoryID = NULL
2835 SET @CurrentDirectoryPath = NULL
2836 SET @CurrentCleanupDate = NULL
2837
2838 SET @CurrentCommand02 = NULL
2839
2840 SET @CurrentCommandOutput02 = NULL
2841
2842 SET @CurrentCommandType02 = NULL
2843 END
2844 END
2845
2846 -- Perform a backup
2847 IF NOT EXISTS (SELECT * FROM @CurrentDirectories WHERE CreateOutput <> 0 OR CreateOutput IS NULL) OR @HostPlatform = 'Linux'
2848 BEGIN
2849 IF @BackupSoftware IS NULL
2850 BEGIN
2851 SELECT @CurrentCommandType03 = CASE
2852 WHEN @CurrentBackupType IN('DIFF','FULL') THEN 'BACKUP_DATABASE'
2853 WHEN @CurrentBackupType = 'LOG' THEN 'BACKUP_LOG'
2854 END
2855
2856 SELECT @CurrentCommand03 = CASE
2857 WHEN @CurrentBackupType IN('DIFF','FULL') THEN 'BACKUP DATABASE ' + QUOTENAME(@CurrentDatabaseName)
2858 WHEN @CurrentBackupType = 'LOG' THEN 'BACKUP LOG ' + QUOTENAME(@CurrentDatabaseName)
2859 END
2860
2861 IF @ReadWriteFileGroups = 'Y' AND @CurrentDatabaseName <> 'master' SET @CurrentCommand03 = @CurrentCommand03 + ' READ_WRITE_FILEGROUPS'
2862
2863 SET @CurrentCommand03 = @CurrentCommand03 + ' TO'
2864
2865 SELECT @CurrentCommand03 = @CurrentCommand03 + ' ' + [Type] + ' = N''' + REPLACE(FilePath,'''','''''') + '''' + CASE WHEN ROW_NUMBER() OVER (ORDER BY FilePath ASC) <> @NumberOfFiles THEN ',' ELSE '' END
2866 FROM @CurrentFiles
2867 WHERE Mirror = 0
2868 ORDER BY FilePath ASC
2869
2870 IF EXISTS(SELECT * FROM @CurrentFiles WHERE Mirror = 1)
2871 BEGIN
2872 SET @CurrentCommand03 = @CurrentCommand03 + ' MIRROR TO'
2873
2874 SELECT @CurrentCommand03 = @CurrentCommand03 + ' ' + [Type] + ' = N''' + REPLACE(FilePath,'''','''''') + '''' + CASE WHEN ROW_NUMBER() OVER (ORDER BY FilePath ASC) <> @NumberOfFiles THEN ',' ELSE '' END
2875 FROM @CurrentFiles
2876 WHERE Mirror = 1
2877 ORDER BY FilePath ASC
2878 END
2879
2880 SET @CurrentCommand03 = @CurrentCommand03 + ' WITH '
2881 IF @CheckSum = 'Y' SET @CurrentCommand03 = @CurrentCommand03 + 'CHECKSUM'
2882 IF @CheckSum = 'N' SET @CurrentCommand03 = @CurrentCommand03 + 'NO_CHECKSUM'
2883
2884 IF @Version >= 10
2885 BEGIN
2886 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
2887 END
2888
2889 IF @CurrentBackupType = 'DIFF' SET @CurrentCommand03 = @CurrentCommand03 + ', DIFFERENTIAL'
2890
2891 IF EXISTS(SELECT * FROM @CurrentFiles WHERE Mirror = 1)
2892 BEGIN
2893 SET @CurrentCommand03 = @CurrentCommand03 + ', FORMAT'
2894 END
2895
2896 IF @CopyOnly = 'Y' SET @CurrentCommand03 = @CurrentCommand03 + ', COPY_ONLY'
2897 IF @NoRecovery = 'Y' AND @CurrentBackupType = 'LOG' SET @CurrentCommand03 = @CurrentCommand03 + ', NORECOVERY'
2898 IF @Init = 'Y' SET @CurrentCommand03 = @CurrentCommand03 + ', INIT'
2899 IF @BlockSize IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', BLOCKSIZE = ' + CAST(@BlockSize AS nvarchar)
2900 IF @BufferCount IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', BUFFERCOUNT = ' + CAST(@BufferCount AS nvarchar)
2901 IF @MaxTransferSize IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', MAXTRANSFERSIZE = ' + CAST(@MaxTransferSize AS nvarchar)
2902 IF @Description IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', DESCRIPTION = N''' + REPLACE(@Description,'''','''''') + ''''
2903 IF @Encrypt = 'Y' SET @CurrentCommand03 = @CurrentCommand03 + ', ENCRYPTION (ALGORITHM = ' + UPPER(@EncryptionAlgorithm) + ', '
2904 IF @Encrypt = 'Y' AND @ServerCertificate IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + 'SERVER CERTIFICATE = ' + QUOTENAME(@ServerCertificate)
2905 IF @Encrypt = 'Y' AND @ServerAsymmetricKey IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + 'SERVER ASYMMETRIC KEY = ' + QUOTENAME(@ServerAsymmetricKey)
2906 IF @Encrypt = 'Y' SET @CurrentCommand03 = @CurrentCommand03 + ')'
2907 IF @URL IS NOT NULL AND @Credential IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', CREDENTIAL = N''' + REPLACE(@Credential,'''','''''') + ''''
2908 END
2909
2910 IF @BackupSoftware = 'LITESPEED'
2911 BEGIN
2912 SELECT @CurrentCommandType03 = CASE
2913 WHEN @CurrentBackupType IN('DIFF','FULL') THEN 'xp_backup_database'
2914 WHEN @CurrentBackupType = 'LOG' THEN 'xp_backup_log'
2915 END
2916
2917 SELECT @CurrentCommand03 = CASE
2918 WHEN @CurrentBackupType IN('DIFF','FULL') THEN 'DECLARE @ReturnCode int EXECUTE @ReturnCode = [master].dbo.xp_backup_database @database = N''' + REPLACE(@CurrentDatabaseName,'''','''''') + ''''
2919 WHEN @CurrentBackupType = 'LOG' THEN 'DECLARE @ReturnCode int EXECUTE @ReturnCode = [master].dbo.xp_backup_log @database = N''' + REPLACE(@CurrentDatabaseName,'''','''''') + ''''
2920 END
2921
2922 SELECT @CurrentCommand03 = @CurrentCommand03 + ', @filename = N''' + REPLACE(FilePath,'''','''''') + ''''
2923 FROM @CurrentFiles
2924 WHERE Mirror = 0
2925 ORDER BY FilePath ASC
2926
2927 IF EXISTS(SELECT * FROM @CurrentFiles WHERE Mirror = 1)
2928 BEGIN
2929 SELECT @CurrentCommand03 = @CurrentCommand03 + ', @mirror = N''' + REPLACE(FilePath,'''','''''') + ''''
2930 FROM @CurrentFiles
2931 WHERE Mirror = 1
2932 ORDER BY FilePath ASC
2933 END
2934
2935 SET @CurrentCommand03 = @CurrentCommand03 + ', @with = '''
2936 IF @CheckSum = 'Y' SET @CurrentCommand03 = @CurrentCommand03 + 'CHECKSUM'
2937 IF @CheckSum = 'N' SET @CurrentCommand03 = @CurrentCommand03 + 'NO_CHECKSUM'
2938 IF @CurrentBackupType = 'DIFF' SET @CurrentCommand03 = @CurrentCommand03 + ', DIFFERENTIAL'
2939 IF @CopyOnly = 'Y' SET @CurrentCommand03 = @CurrentCommand03 + ', COPY_ONLY'
2940 IF @NoRecovery = 'Y' AND @CurrentBackupType = 'LOG' SET @CurrentCommand03 = @CurrentCommand03 + ', NORECOVERY'
2941 IF @BlockSize IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', BLOCKSIZE = ' + CAST(@BlockSize AS nvarchar)
2942 SET @CurrentCommand03 = @CurrentCommand03 + ''''
2943 IF @ReadWriteFileGroups = 'Y' AND @CurrentDatabaseName <> 'master' SET @CurrentCommand03 = @CurrentCommand03 + ', @read_write_filegroups = 1'
2944 IF @CompressionLevel IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', @compressionlevel = ' + CAST(@CompressionLevel AS nvarchar)
2945 IF @AdaptiveCompression IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', @adaptivecompression = ''' + CASE WHEN @AdaptiveCompression = 'SIZE' THEN 'Size' WHEN @AdaptiveCompression = 'SPEED' THEN 'Speed' END + ''''
2946 IF @BufferCount IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', @buffercount = ' + CAST(@BufferCount AS nvarchar)
2947 IF @MaxTransferSize IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', @maxtransfersize = ' + CAST(@MaxTransferSize AS nvarchar)
2948 IF @Threads IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', @threads = ' + CAST(@Threads AS nvarchar)
2949 IF @Init = 'Y' SET @CurrentCommand03 = @CurrentCommand03 + ', @init = 1'
2950 IF @Throttle IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', @throttle = ' + CAST(@Throttle AS nvarchar)
2951 IF @Description IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', @desc = N''' + REPLACE(@Description,'''','''''') + ''''
2952
2953 IF @EncryptionAlgorithm IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', @cryptlevel = ' + CASE
2954 WHEN @EncryptionAlgorithm = 'RC2_40' THEN '0'
2955 WHEN @EncryptionAlgorithm = 'RC2_56' THEN '1'
2956 WHEN @EncryptionAlgorithm = 'RC2_112' THEN '2'
2957 WHEN @EncryptionAlgorithm = 'RC2_128' THEN '3'
2958 WHEN @EncryptionAlgorithm = 'TRIPLE_DES_3KEY' THEN '4'
2959 WHEN @EncryptionAlgorithm = 'RC4_128' THEN '5'
2960 WHEN @EncryptionAlgorithm = 'AES_128' THEN '6'
2961 WHEN @EncryptionAlgorithm = 'AES_192' THEN '7'
2962 WHEN @EncryptionAlgorithm = 'AES_256' THEN '8'
2963 END
2964
2965 IF @EncryptionKey IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', @encryptionkey = N''' + REPLACE(@EncryptionKey,'''','''''') + ''''
2966 SET @CurrentCommand03 = @CurrentCommand03 + ' IF @ReturnCode <> 0 RAISERROR(''Error performing LiteSpeed backup.'', 16, 1)'
2967 END
2968
2969 IF @BackupSoftware = 'SQLBACKUP'
2970 BEGIN
2971 SET @CurrentCommandType03 = 'sqlbackup'
2972
2973 SELECT @CurrentCommand03 = CASE
2974 WHEN @CurrentBackupType IN('DIFF','FULL') THEN 'BACKUP DATABASE ' + QUOTENAME(@CurrentDatabaseName)
2975 WHEN @CurrentBackupType = 'LOG' THEN 'BACKUP LOG ' + QUOTENAME(@CurrentDatabaseName)
2976 END
2977
2978 IF @ReadWriteFileGroups = 'Y' AND @CurrentDatabaseName <> 'master' SET @CurrentCommand03 = @CurrentCommand03 + ' READ_WRITE_FILEGROUPS'
2979
2980 SET @CurrentCommand03 = @CurrentCommand03 + ' TO'
2981
2982 SELECT @CurrentCommand03 = @CurrentCommand03 + ' DISK = N''' + REPLACE(FilePath,'''','''''') + '''' + CASE WHEN ROW_NUMBER() OVER (ORDER BY FilePath ASC) <> @NumberOfFiles THEN ',' ELSE '' END
2983 FROM @CurrentFiles
2984 WHERE Mirror = 0
2985 ORDER BY FilePath ASC
2986
2987 SET @CurrentCommand03 = @CurrentCommand03 + ' WITH '
2988
2989 IF EXISTS(SELECT * FROM @CurrentFiles WHERE Mirror = 1)
2990 BEGIN
2991 SET @CurrentCommand03 = @CurrentCommand03 + ' MIRRORFILE' + ' = N''' + REPLACE((SELECT FilePath FROM @CurrentFiles WHERE Mirror = 1),'''','''''') + ''', '
2992 END
2993
2994 IF @CheckSum = 'Y' SET @CurrentCommand03 = @CurrentCommand03 + 'CHECKSUM'
2995 IF @CheckSum = 'N' SET @CurrentCommand03 = @CurrentCommand03 + 'NO_CHECKSUM'
2996 IF @CurrentBackupType = 'DIFF' SET @CurrentCommand03 = @CurrentCommand03 + ', DIFFERENTIAL'
2997 IF @CopyOnly = 'Y' SET @CurrentCommand03 = @CurrentCommand03 + ', COPY_ONLY'
2998 IF @NoRecovery = 'Y' AND @CurrentBackupType = 'LOG' SET @CurrentCommand03 = @CurrentCommand03 + ', NORECOVERY'
2999 IF @Init = 'Y' SET @CurrentCommand03 = @CurrentCommand03 + ', INIT'
3000 IF @CompressionLevel IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', COMPRESSION = ' + CAST(@CompressionLevel AS nvarchar)
3001 IF @Threads IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', THREADCOUNT = ' + CAST(@Threads AS nvarchar)
3002 IF @MaxTransferSize IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', MAXTRANSFERSIZE = ' + CAST(@MaxTransferSize AS nvarchar)
3003 IF @Description IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', DESCRIPTION = N''' + REPLACE(@Description,'''','''''') + ''''
3004
3005 IF @EncryptionAlgorithm IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', KEYSIZE = ' + CASE
3006 WHEN @EncryptionAlgorithm = 'AES_128' THEN '128'
3007 WHEN @EncryptionAlgorithm = 'AES_256' THEN '256'
3008 END
3009
3010 IF @EncryptionKey IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', PASSWORD = N''' + REPLACE(@EncryptionKey,'''','''''') + ''''
3011 SET @CurrentCommand03 = 'DECLARE @ReturnCode int EXECUTE @ReturnCode = [master].dbo.sqlbackup N''-SQL "' + REPLACE(@CurrentCommand03,'''','''''') + '"''' + ' IF @ReturnCode <> 0 RAISERROR(''Error performing SQLBackup backup.'', 16, 1)'
3012 END
3013
3014 IF @BackupSoftware = 'SQLSAFE'
3015 BEGIN
3016 SET @CurrentCommandType03 = 'xp_ss_backup'
3017
3018 SET @CurrentCommand03 = 'DECLARE @ReturnCode int EXECUTE @ReturnCode = [master].dbo.xp_ss_backup @database = N''' + REPLACE(@CurrentDatabaseName,'''','''''') + ''''
3019
3020 SELECT @CurrentCommand03 = @CurrentCommand03 + ', ' + CASE WHEN ROW_NUMBER() OVER (ORDER BY FilePath ASC) = 1 THEN '@filename' ELSE '@backupfile' END + ' = N''' + REPLACE(FilePath,'''','''''') + ''''
3021 FROM @CurrentFiles
3022 WHERE Mirror = 0
3023 ORDER BY FilePath ASC
3024
3025 SELECT @CurrentCommand03 = @CurrentCommand03 + ', @mirrorfile = N''' + REPLACE(FilePath,'''','''''') + ''''
3026 FROM @CurrentFiles
3027 WHERE Mirror = 1
3028 ORDER BY FilePath ASC
3029
3030 SET @CurrentCommand03 = @CurrentCommand03 + ', @backuptype = ' + CASE WHEN @CurrentBackupType = 'FULL' THEN '''Full''' WHEN @CurrentBackupType = 'DIFF' THEN '''Differential''' WHEN @CurrentBackupType = 'LOG' THEN '''Log''' END
3031 IF @ReadWriteFileGroups = 'Y' AND @CurrentDatabaseName <> 'master' SET @CurrentCommand03 = @CurrentCommand03 + ', @readwritefilegroups = 1'
3032 SET @CurrentCommand03 = @CurrentCommand03 + ', @checksum = ' + CASE WHEN @CheckSum = 'Y' THEN '1' WHEN @CheckSum = 'N' THEN '0' END
3033 SET @CurrentCommand03 = @CurrentCommand03 + ', @copyonly = ' + CASE WHEN @CopyOnly = 'Y' THEN '1' WHEN @CopyOnly = 'N' THEN '0' END
3034 IF @CompressionLevel IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', @compressionlevel = ' + CAST(@CompressionLevel AS nvarchar)
3035 IF @Threads IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', @threads = ' + CAST(@Threads AS nvarchar)
3036 IF @Init = 'Y' SET @CurrentCommand03 = @CurrentCommand03 + ', @overwrite = 1'
3037 IF @Description IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', @desc = N''' + REPLACE(@Description,'''','''''') + ''''
3038
3039 IF @EncryptionAlgorithm IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', @encryptiontype = N''' + CASE
3040 WHEN @EncryptionAlgorithm = 'AES_128' THEN 'AES128'
3041 WHEN @EncryptionAlgorithm = 'AES_256' THEN 'AES256'
3042 END + ''''
3043
3044 IF @EncryptionKey IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ', @encryptedbackuppassword = N''' + REPLACE(@EncryptionKey,'''','''''') + ''''
3045 SET @CurrentCommand03 = @CurrentCommand03 + ' IF @ReturnCode <> 0 RAISERROR(''Error performing SQLsafe backup.'', 16, 1)'
3046 END
3047
3048 IF @BackupSoftware = 'DATA_DOMAIN_BOOST'
3049 BEGIN
3050 SET @CurrentCommandType03 = 'emc_run_backup'
3051
3052 SET @CurrentCommand03 = 'DECLARE @ReturnCode int EXECUTE @ReturnCode = [master].dbo.emc_run_backup '''
3053
3054 SET @CurrentCommand03 = @CurrentCommand03 + ' -c ' + CASE WHEN @CurrentAvailabilityGroup IS NOT NULL THEN @Cluster ELSE CAST(SERVERPROPERTY('MachineName') AS nvarchar) END
3055
3056 SET @CurrentCommand03 = @CurrentCommand03 + ' -l ' + CASE
3057 WHEN @CurrentBackupType = 'FULL' THEN 'full'
3058 WHEN @CurrentBackupType = 'DIFF' THEN 'diff'
3059 WHEN @CurrentBackupType = 'LOG' THEN 'incr'
3060 END
3061
3062 IF @NoRecovery = 'Y' SET @CurrentCommand03 = @CurrentCommand03 + ' -H'
3063
3064 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'
3065
3066 IF @CheckSum = 'Y' SET @CurrentCommand03 = @CurrentCommand03 + ' -k'
3067
3068 SET @CurrentCommand03 = @CurrentCommand03 + ' -S ' + CAST(@NumberOfFiles AS nvarchar)
3069
3070 IF @Description IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ' -b "' + REPLACE(@Description,'''','''''') + '"'
3071
3072 IF @BufferCount IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ' -O "BUFFERCOUNT=' + CAST(@BufferCount AS nvarchar) + '"'
3073
3074 IF @ReadWriteFileGroups = 'Y' AND @CurrentDatabaseName <> 'master' SET @CurrentCommand03 = @CurrentCommand03 + ' -O "READ_WRITE_FILEGROUPS"'
3075
3076 SET @CurrentCommand03 = @CurrentCommand03 + ' -a "NSR_DFA_SI=TRUE"'
3077 SET @CurrentCommand03 = @CurrentCommand03 + ' -a "NSR_DFA_SI_USE_DD=TRUE"'
3078 IF @DataDomainBoostHost IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ' -a "NSR_DFA_SI_DD_HOST=' + REPLACE(@DataDomainBoostHost,'''','''''') + '"'
3079 IF @DataDomainBoostUser IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ' -a "NSR_DFA_SI_DD_USER=' + REPLACE(@DataDomainBoostUser,'''','''''') + '"'
3080 IF @DataDomainBoostDevicePath IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ' -a "NSR_DFA_SI_DEVICE_PATH=' + REPLACE(@DataDomainBoostDevicePath,'''','''''') + '"'
3081 IF @DataDomainBoostLockboxPath IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ' -a "NSR_DFA_SI_DD_LOCKBOX_PATH=' + REPLACE(@DataDomainBoostLockboxPath,'''','''''') + '"'
3082 SET @CurrentCommand03 = @CurrentCommand03 + ' -a "NSR_SKIP_NON_BACKUPABLE_STATE_DB=TRUE"'
3083 IF @CopyOnly = 'Y' SET @CurrentCommand03 = @CurrentCommand03 + ' -a "NSR_COPY_ONLY=TRUE"'
3084
3085 IF SERVERPROPERTY('InstanceName') IS NULL SET @CurrentCommand03 = @CurrentCommand03 + ' "MSSQL' + ':' + REPLACE(REPLACE(@CurrentDatabaseName,'''',''''''),'.','\.') + '"'
3086 IF SERVERPROPERTY('InstanceName') IS NOT NULL SET @CurrentCommand03 = @CurrentCommand03 + ' "MSSQL$' + CAST(SERVERPROPERTY('InstanceName') AS nvarchar) + ':' + REPLACE(REPLACE(@CurrentDatabaseName,'''',''''''),'.','\.') + '"'
3087
3088 SET @CurrentCommand03 = @CurrentCommand03 + ''''
3089
3090 SET @CurrentCommand03 = @CurrentCommand03 + ' IF @ReturnCode <> 0 RAISERROR(''Error performing Data Domain Boost backup.'', 16, 1)'
3091 END
3092
3093 EXECUTE @CurrentCommandOutput03 = [dbo].[CommandExecute] @Command = @CurrentCommand03, @CommandType = @CurrentCommandType03, @Mode = 1, @DatabaseName = @CurrentDatabaseName, @LogToTable = @LogToTable, @Execute = @Execute
3094 SET @Error = @@ERROR
3095 IF @Error <> 0 SET @CurrentCommandOutput03 = @Error
3096 IF @CurrentCommandOutput03 <> 0 SET @ReturnCode = @CurrentCommandOutput03
3097 END
3098
3099 -- Verify the backup
3100 IF @CurrentCommandOutput03 = 0 AND @Verify = 'Y'
3101 BEGIN
3102 WHILE (1 = 1)
3103 BEGIN
3104 SELECT TOP 1 @CurrentBackupSetID = ID,
3105 @CurrentIsMirror = Mirror
3106 FROM @CurrentBackupSet
3107 WHERE VerifyCompleted = 0
3108 ORDER BY ID ASC
3109
3110 IF @@ROWCOUNT = 0
3111 BEGIN
3112 BREAK
3113 END
3114
3115 IF @BackupSoftware IS NULL
3116 BEGIN
3117 SET @CurrentCommandType04 = 'RESTORE_VERIFYONLY'
3118
3119 SET @CurrentCommand04 = 'RESTORE VERIFYONLY FROM'
3120
3121 SELECT @CurrentCommand04 = @CurrentCommand04 + ' ' + [Type] + ' = N''' + REPLACE(FilePath,'''','''''') + '''' + CASE WHEN ROW_NUMBER() OVER (ORDER BY FilePath ASC) <> @NumberOfFiles THEN ',' ELSE '' END
3122 FROM @CurrentFiles
3123 WHERE Mirror = @CurrentIsMirror
3124 ORDER BY FilePath ASC
3125
3126 SET @CurrentCommand04 = @CurrentCommand04 + ' WITH '
3127 IF @CheckSum = 'Y' SET @CurrentCommand04 = @CurrentCommand04 + 'CHECKSUM'
3128 IF @CheckSum = 'N' SET @CurrentCommand04 = @CurrentCommand04 + 'NO_CHECKSUM'
3129 IF @URL IS NOT NULL AND @Credential IS NOT NULL SET @CurrentCommand04 = @CurrentCommand04 + ', CREDENTIAL = N''' + REPLACE(@Credential,'''','''''') + ''''
3130 END
3131
3132 IF @BackupSoftware = 'LITESPEED'
3133 BEGIN
3134 SET @CurrentCommandType04 = 'xp_restore_verifyonly'
3135
3136 SET @CurrentCommand04 = 'DECLARE @ReturnCode int EXECUTE @ReturnCode = [master].dbo.xp_restore_verifyonly'
3137
3138 SELECT @CurrentCommand04 = @CurrentCommand04 + ' @filename = N''' + REPLACE(FilePath,'''','''''') + '''' + CASE WHEN ROW_NUMBER() OVER (ORDER BY FilePath ASC) <> @NumberOfFiles THEN ',' ELSE '' END
3139 FROM @CurrentFiles
3140 WHERE Mirror = @CurrentIsMirror
3141 ORDER BY FilePath ASC
3142
3143 SET @CurrentCommand04 = @CurrentCommand04 + ', @with = '''
3144 IF @CheckSum = 'Y' SET @CurrentCommand04 = @CurrentCommand04 + 'CHECKSUM'
3145 IF @CheckSum = 'N' SET @CurrentCommand04 = @CurrentCommand04 + 'NO_CHECKSUM'
3146 SET @CurrentCommand04 = @CurrentCommand04 + ''''
3147 IF @EncryptionKey IS NOT NULL SET @CurrentCommand04 = @CurrentCommand04 + ', @encryptionkey = N''' + REPLACE(@EncryptionKey,'''','''''') + ''''
3148
3149 SET @CurrentCommand04 = @CurrentCommand04 + ' IF @ReturnCode <> 0 RAISERROR(''Error verifying LiteSpeed backup.'', 16, 1)'
3150 END
3151
3152 IF @BackupSoftware = 'SQLBACKUP'
3153 BEGIN
3154 SET @CurrentCommandType04 = 'sqlbackup'
3155
3156 SET @CurrentCommand04 = 'RESTORE VERIFYONLY FROM'
3157
3158 SELECT @CurrentCommand04 = @CurrentCommand04 + ' DISK = N''' + REPLACE(FilePath,'''','''''') + '''' + CASE WHEN ROW_NUMBER() OVER (ORDER BY FilePath ASC) <> @NumberOfFiles THEN ',' ELSE '' END
3159 FROM @CurrentFiles
3160 WHERE Mirror = @CurrentIsMirror
3161 ORDER BY FilePath ASC
3162
3163 SET @CurrentCommand04 = @CurrentCommand04 + ' WITH '
3164 IF @CheckSum = 'Y' SET @CurrentCommand04 = @CurrentCommand04 + 'CHECKSUM'
3165 IF @CheckSum = 'N' SET @CurrentCommand04 = @CurrentCommand04 + 'NO_CHECKSUM'
3166 IF @EncryptionKey IS NOT NULL SET @CurrentCommand04 = @CurrentCommand04 + ', PASSWORD = N''' + REPLACE(@EncryptionKey,'''','''''') + ''''
3167
3168 SET @CurrentCommand04 = 'DECLARE @ReturnCode int EXECUTE @ReturnCode = [master].dbo.sqlbackup N''-SQL "' + REPLACE(@CurrentCommand04,'''','''''') + '"''' + ' IF @ReturnCode <> 0 RAISERROR(''Error verifying SQLBackup backup.'', 16, 1)'
3169 END
3170
3171 IF @BackupSoftware = 'SQLSAFE'
3172 BEGIN
3173 SET @CurrentCommandType04 = 'xp_ss_verify'
3174
3175 SET @CurrentCommand04 = 'DECLARE @ReturnCode int EXECUTE @ReturnCode = [master].dbo.xp_ss_verify @database = N''' + REPLACE(@CurrentDatabaseName,'''','''''') + ''''
3176
3177 SELECT @CurrentCommand04 = @CurrentCommand04 + ', ' + CASE WHEN ROW_NUMBER() OVER (ORDER BY FilePath ASC) = 1 THEN '@filename' ELSE '@backupfile' END + ' = N''' + REPLACE(FilePath,'''','''''') + ''''
3178 FROM @CurrentFiles
3179 WHERE Mirror = @CurrentIsMirror
3180 ORDER BY FilePath ASC
3181
3182 SET @CurrentCommand04 = @CurrentCommand04 + ' IF @ReturnCode <> 0 RAISERROR(''Error verifying SQLsafe backup.'', 16, 1)'
3183 END
3184
3185 EXECUTE @CurrentCommandOutput04 = [dbo].[CommandExecute] @Command = @CurrentCommand04, @CommandType = @CurrentCommandType04, @Mode = 1, @DatabaseName = @CurrentDatabaseName, @LogToTable = @LogToTable, @Execute = @Execute
3186 SET @Error = @@ERROR
3187 IF @Error <> 0 SET @CurrentCommandOutput04 = @Error
3188 IF @CurrentCommandOutput04 <> 0 SET @ReturnCode = @CurrentCommandOutput04
3189
3190 UPDATE @CurrentBackupSet
3191 SET VerifyCompleted = 1,
3192 VerifyOutput = @CurrentCommandOutput04
3193 WHERE ID = @CurrentBackupSetID
3194
3195 SET @CurrentBackupSetID = NULL
3196 SET @CurrentIsMirror = NULL
3197
3198 SET @CurrentCommand04 = NULL
3199
3200 SET @CurrentCommandOutput04 = NULL
3201
3202 SET @CurrentCommandType04 = NULL
3203 END
3204 END
3205
3206 IF @CleanupMode = 'AFTER_BACKUP'
3207 BEGIN
3208 INSERT INTO @CurrentCleanupDates (CleanupDate, Mirror)
3209 SELECT DATEADD(hh,-(@CleanupTime),GETDATE()), 0
3210
3211 IF NOT EXISTS(SELECT * FROM @CurrentCleanupDates WHERE (Mirror = 0 OR Mirror IS NULL) AND CleanupDate IS NULL)
3212 BEGIN
3213 UPDATE @CurrentDirectories
3214 SET CleanupDate = (SELECT MIN(CleanupDate)
3215 FROM @CurrentCleanupDates
3216 WHERE (Mirror = 0 OR Mirror IS NULL)),
3217 CleanupMode = 'AFTER_BACKUP'
3218 WHERE Mirror = 0
3219 END
3220 END
3221
3222 IF @MirrorCleanupMode = 'AFTER_BACKUP'
3223 BEGIN
3224 INSERT INTO @CurrentCleanupDates (CleanupDate, Mirror)
3225 SELECT DATEADD(hh,-(@MirrorCleanupTime),GETDATE()), 1
3226
3227 IF NOT EXISTS(SELECT * FROM @CurrentCleanupDates WHERE (Mirror = 1 OR Mirror IS NULL) AND CleanupDate IS NULL)
3228 BEGIN
3229 UPDATE @CurrentDirectories
3230 SET CleanupDate = (SELECT MIN(CleanupDate)
3231 FROM @CurrentCleanupDates
3232 WHERE (Mirror = 1 OR Mirror IS NULL)),
3233 CleanupMode = 'AFTER_BACKUP'
3234 WHERE Mirror = 1
3235 END
3236 END
3237
3238 -- Delete old backup files, after backup
3239 IF ((@CurrentCommandOutput03 = 0 AND @Verify = 'N')
3240 OR (@CurrentCommandOutput03 = 0 AND @Verify = 'Y' AND NOT EXISTS (SELECT * FROM @CurrentBackupSet WHERE VerifyOutput <> 0 OR VerifyOutput IS NULL)))
3241 AND @HostPlatform = 'Windows'
3242 AND (@BackupSoftware <> 'DATA_DOMAIN_BOOST' OR @BackupSoftware IS NULL)
3243 AND @CurrentBackupType = @BackupType
3244 BEGIN
3245 WHILE (1 = 1)
3246 BEGIN
3247 SELECT TOP 1 @CurrentDirectoryID = ID,
3248 @CurrentDirectoryPath = DirectoryPath,
3249 @CurrentCleanupDate = CleanupDate
3250 FROM @CurrentDirectories
3251 WHERE CleanupDate IS NOT NULL
3252 AND CleanupMode = 'AFTER_BACKUP'
3253 AND CleanupCompleted = 0
3254 ORDER BY ID ASC
3255
3256 IF @@ROWCOUNT = 0
3257 BEGIN
3258 BREAK
3259 END
3260
3261 IF @BackupSoftware IS NULL
3262 BEGIN
3263 SET @CurrentCommandType05 = 'xp_delete_file'
3264
3265 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)'
3266 END
3267
3268 IF @BackupSoftware = 'LITESPEED'
3269 BEGIN
3270 SET @CurrentCommandType05 = 'xp_slssqlmaint'
3271
3272 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)'
3273 END
3274
3275 IF @BackupSoftware = 'SQLBACKUP'
3276 BEGIN
3277 SET @CurrentCommandType05 = 'sqbutility'
3278
3279 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)'
3280 END
3281
3282 IF @BackupSoftware = 'SQLSAFE'
3283 BEGIN
3284 SET @CurrentCommandType05 = 'xp_ss_delete'
3285
3286 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)'
3287 END
3288
3289 EXECUTE @CurrentCommandOutput05 = [dbo].[CommandExecute] @Command = @CurrentCommand05, @CommandType = @CurrentCommandType05, @Mode = 1, @DatabaseName = @CurrentDatabaseName, @LogToTable = @LogToTable, @Execute = @Execute
3290 SET @Error = @@ERROR
3291 IF @Error <> 0 SET @CurrentCommandOutput05 = @Error
3292 IF @CurrentCommandOutput05 <> 0 SET @ReturnCode = @CurrentCommandOutput05
3293
3294 UPDATE @CurrentDirectories
3295 SET CleanupCompleted = 1,
3296 CleanupOutput = @CurrentCommandOutput05
3297 WHERE ID = @CurrentDirectoryID
3298
3299 SET @CurrentDirectoryID = NULL
3300 SET @CurrentDirectoryPath = NULL
3301 SET @CurrentCleanupDate = NULL
3302
3303 SET @CurrentCommand05 = NULL
3304
3305 SET @CurrentCommandOutput05 = NULL
3306
3307 SET @CurrentCommandType05 = NULL
3308 END
3309 END
3310 END
3311
3312 IF DATABASEPROPERTYEX(@CurrentDatabaseName,'Status') = 'SUSPECT'
3313 BEGIN
3314 SET @ErrorMessage = 'The database ' + QUOTENAME(@CurrentDatabaseName) + ' is in a SUSPECT state.' + CHAR(13) + CHAR(10) + ' '
3315 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
3316 SET @Error = @@ERROR
3317 END
3318
3319 -- Update that the database is completed
3320 IF @DatabasesInParallel = 'Y'
3321 BEGIN
3322 UPDATE dbo.QueueDatabase
3323 SET DatabaseEndTime = GETDATE()
3324 WHERE QueueID = @QueueID
3325 AND DatabaseName = @CurrentDatabaseName
3326 END
3327 ELSE
3328 BEGIN
3329 UPDATE @tmpDatabases
3330 SET Completed = 1
3331 WHERE Selected = 1
3332 AND Completed = 0
3333 AND ID = @CurrentDBID
3334 END
3335
3336 -- Clear variables
3337 SET @CurrentDBID = NULL
3338 SET @CurrentDatabaseID = NULL
3339 SET @CurrentDatabaseName = NULL
3340 SET @CurrentBackupType = NULL
3341 SET @CurrentFileExtension = NULL
3342 SET @CurrentFileNumber = NULL
3343 SET @CurrentDifferentialBaseLSN = NULL
3344 SET @CurrentDifferentialBaseIsSnapshot = NULL
3345 SET @CurrentLogLSN = NULL
3346 SET @CurrentLatestBackup = NULL
3347 SET @CurrentDatabaseNameFS = NULL
3348 SET @CurrentDirectoryStructure = NULL
3349 SET @CurrentDatabaseFileName = NULL
3350 SET @CurrentMaxFilePathLength = NULL
3351 SET @CurrentDate = NULL
3352 SET @CurrentCleanupDate = NULL
3353 SET @CurrentIsDatabaseAccessible = NULL
3354 SET @CurrentAvailabilityGroup = NULL
3355 SET @CurrentAvailabilityGroupRole = NULL
3356 SET @CurrentAvailabilityGroupBackupPreference = NULL
3357 SET @CurrentIsPreferredBackupReplica = NULL
3358 SET @CurrentDatabaseMirroringRole = NULL
3359 SET @CurrentLogShippingRole = NULL
3360 SET @CurrentIsEncrypted = NULL
3361 SET @CurrentIsReadOnly = NULL
3362 SET @CurrentLastLogBackup = NULL
3363 SET @CurrentLogSizeSinceLastLogBackup = NULL
3364 SET @CurrentAllocatedExtentPageCount = NULL
3365 SET @CurrentModifiedExtentPageCount = NULL
3366
3367 SET @CurrentCommand03 = NULL
3368 SET @CurrentCommand06 = NULL
3369 SET @CurrentCommand07 = NULL
3370
3371 SET @CurrentCommandOutput03 = NULL
3372
3373 SET @CurrentCommandType03 = NULL
3374
3375 DELETE FROM @CurrentDirectories
3376 DELETE FROM @CurrentURLs
3377 DELETE FROM @CurrentFiles
3378 DELETE FROM @CurrentCleanupDates
3379 DELETE FROM @CurrentBackupSet
3380
3381 END
3382
3383 ----------------------------------------------------------------------------------------------------
3384 --// Log completing information //--
3385 ----------------------------------------------------------------------------------------------------
3386
3387 Logging:
3388 SET @EndMessage = 'Date and time: ' + CONVERT(nvarchar,GETDATE(),120)
3389 SET @EndMessage = REPLACE(@EndMessage,'%','%%')
3390 RAISERROR(@EndMessage,10,1) WITH NOWAIT
3391
3392 IF @ReturnCode <> 0
3393 BEGIN
3394 RETURN @ReturnCode
3395 END
3396
3397 ----------------------------------------------------------------------------------------------------
3398
3399END
3400GO
3401SET ANSI_NULLS ON
3402GO
3403SET QUOTED_IDENTIFIER ON
3404GO
3405IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[DatabaseIntegrityCheck]') AND type in (N'P', N'PC'))
3406BEGIN
3407EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[DatabaseIntegrityCheck] AS'
3408END
3409GO
3410ALTER PROCEDURE [dbo].[DatabaseIntegrityCheck]
3411
3412@Databases nvarchar(max) = NULL,
3413@CheckCommands nvarchar(max) = 'CHECKDB',
3414@PhysicalOnly nvarchar(max) = 'N',
3415@NoIndex nvarchar(max) = 'N',
3416@ExtendedLogicalChecks nvarchar(max) = 'N',
3417@TabLock nvarchar(max) = 'N',
3418@FileGroups nvarchar(max) = NULL,
3419@Objects nvarchar(max) = NULL,
3420@MaxDOP int = NULL,
3421@AvailabilityGroups nvarchar(max) = NULL,
3422@AvailabilityGroupReplicas nvarchar(max) = 'ALL',
3423@Updateability nvarchar(max) = 'ALL',
3424@TimeLimit int = NULL,
3425@LockTimeout int = NULL,
3426@LockMessageSeverity int = 16,
3427@DatabaseOrder nvarchar(max) = NULL,
3428@DatabasesInParallel nvarchar(max) = 'N',
3429@LogToTable nvarchar(max) = 'N',
3430@Execute nvarchar(max) = 'Y'
3431
3432AS
3433
3434BEGIN
3435
3436 SET NOCOUNT ON
3437
3438 DECLARE @StartMessage nvarchar(max)
3439 DECLARE @EndMessage nvarchar(max)
3440 DECLARE @DatabaseMessage nvarchar(max)
3441 DECLARE @ErrorMessage nvarchar(max)
3442 DECLARE @Severity int
3443
3444 DECLARE @StartTime datetime
3445 DECLARE @SchemaName nvarchar(max)
3446 DECLARE @ObjectName nvarchar(max)
3447 DECLARE @VersionTimestamp nvarchar(max)
3448 DECLARE @Parameters nvarchar(max)
3449
3450 DECLARE @Version numeric(18,10)
3451 DECLARE @HostPlatform nvarchar(max)
3452 DECLARE @AmazonRDS bit
3453
3454 DECLARE @QueueID int
3455 DECLARE @QueueStartTime datetime
3456
3457 DECLARE @CurrentDBID int
3458 DECLARE @CurrentDatabaseID int
3459 DECLARE @CurrentDatabaseName nvarchar(max)
3460 DECLARE @CurrentIsDatabaseAccessible bit
3461 DECLARE @CurrentAvailabilityGroup nvarchar(max)
3462 DECLARE @CurrentAvailabilityGroupRole nvarchar(max)
3463 DECLARE @CurrentAvailabilityGroupBackupPreference nvarchar(max)
3464 DECLARE @CurrentIsPreferredBackupReplica bit
3465 DECLARE @CurrentDatabaseMirroringRole nvarchar(max)
3466 DECLARE @CurrentIsReadOnly bit
3467
3468 DECLARE @CurrentFGID int
3469 DECLARE @CurrentFileGroupID int
3470 DECLARE @CurrentFileGroupName nvarchar(max)
3471 DECLARE @CurrentFileGroupExists bit
3472
3473 DECLARE @CurrentOID int
3474 DECLARE @CurrentSchemaID int
3475 DECLARE @CurrentSchemaName nvarchar(max)
3476 DECLARE @CurrentObjectID int
3477 DECLARE @CurrentObjectName nvarchar(max)
3478 DECLARE @CurrentObjectType nvarchar(max)
3479 DECLARE @CurrentObjectExists bit
3480
3481 DECLARE @CurrentCommand01 nvarchar(max)
3482 DECLARE @CurrentCommand02 nvarchar(max)
3483 DECLARE @CurrentCommand03 nvarchar(max)
3484 DECLARE @CurrentCommand04 nvarchar(max)
3485 DECLARE @CurrentCommand05 nvarchar(max)
3486 DECLARE @CurrentCommand06 nvarchar(max)
3487 DECLARE @CurrentCommand07 nvarchar(max)
3488 DECLARE @CurrentCommand08 nvarchar(max)
3489 DECLARE @CurrentCommand09 nvarchar(max)
3490
3491 DECLARE @CurrentCommandOutput01 int
3492 DECLARE @CurrentCommandOutput04 int
3493 DECLARE @CurrentCommandOutput05 int
3494 DECLARE @CurrentCommandOutput08 int
3495 DECLARE @CurrentCommandOutput09 int
3496
3497 DECLARE @CurrentCommandType01 nvarchar(max)
3498 DECLARE @CurrentCommandType04 nvarchar(max)
3499 DECLARE @CurrentCommandType05 nvarchar(max)
3500 DECLARE @CurrentCommandType08 nvarchar(max)
3501 DECLARE @CurrentCommandType09 nvarchar(max)
3502
3503 DECLARE @tmpDatabases TABLE (ID int IDENTITY,
3504 DatabaseName nvarchar(max),
3505 DatabaseType nvarchar(max),
3506 AvailabilityGroup bit,
3507 [Snapshot] bit,
3508 StartPosition int,
3509 LastCommandTime datetime,
3510 DatabaseSize bigint,
3511 LastGoodCheckDbTime datetime,
3512 [Order] int,
3513 Selected bit,
3514 Completed bit,
3515 PRIMARY KEY(Selected, Completed, [Order], ID))
3516
3517 DECLARE @tmpAvailabilityGroups TABLE (ID int IDENTITY PRIMARY KEY,
3518 AvailabilityGroupName nvarchar(max),
3519 StartPosition int,
3520 Selected bit)
3521
3522 DECLARE @tmpDatabasesAvailabilityGroups TABLE (DatabaseName nvarchar(max),
3523 AvailabilityGroupName nvarchar(max))
3524
3525 DECLARE @tmpFileGroups TABLE (ID int IDENTITY,
3526 FileGroupID int,
3527 FileGroupName nvarchar(max),
3528 StartPosition int,
3529 [Order] int,
3530 Selected bit,
3531 Completed bit,
3532 PRIMARY KEY(Selected, Completed, [Order], ID))
3533
3534 DECLARE @tmpObjects TABLE (ID int IDENTITY,
3535 SchemaID int,
3536 SchemaName nvarchar(max),
3537 ObjectID int,
3538 ObjectName nvarchar(max),
3539 ObjectType nvarchar(max),
3540 StartPosition int,
3541 [Order] int,
3542 Selected bit,
3543 Completed bit,
3544 PRIMARY KEY(Selected, Completed, [Order], ID))
3545
3546 DECLARE @SelectedDatabases TABLE (DatabaseName nvarchar(max),
3547 DatabaseType nvarchar(max),
3548 AvailabilityGroup nvarchar(max),
3549 StartPosition int,
3550 Selected bit)
3551
3552 DECLARE @SelectedAvailabilityGroups TABLE (AvailabilityGroupName nvarchar(max),
3553 StartPosition int,
3554 Selected bit)
3555
3556 DECLARE @SelectedFileGroups TABLE (DatabaseName nvarchar(max),
3557 FileGroupName nvarchar(max),
3558 StartPosition int,
3559 Selected bit)
3560
3561 DECLARE @SelectedObjects TABLE (DatabaseName nvarchar(max),
3562 SchemaName nvarchar(max),
3563 ObjectName nvarchar(max),
3564 StartPosition int,
3565 Selected bit)
3566
3567 DECLARE @SelectedCheckCommands TABLE (CheckCommand nvarchar(max))
3568
3569 DECLARE @Error int
3570 DECLARE @ReturnCode int
3571
3572 SET @Error = 0
3573 SET @ReturnCode = 0
3574
3575 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))
3576
3577 IF @Version >= 14
3578 BEGIN
3579 SELECT @HostPlatform = host_platform
3580 FROM sys.dm_os_host_info
3581 END
3582 ELSE
3583 BEGIN
3584 SET @HostPlatform = 'Windows'
3585 END
3586
3587 SET @AmazonRDS = CASE WHEN DB_ID('rdsadmin') IS NOT NULL AND SUSER_SNAME(0x01) = 'rdsa' THEN 1 ELSE 0 END
3588
3589 ----------------------------------------------------------------------------------------------------
3590 --// Log initial information //--
3591 ----------------------------------------------------------------------------------------------------
3592
3593 SET @StartTime = GETDATE()
3594 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)
3595 SET @ObjectName = OBJECT_NAME(@@PROCID)
3596 SET @VersionTimestamp = SUBSTRING(OBJECT_DEFINITION(@@PROCID),CHARINDEX('--// Version: ',OBJECT_DEFINITION(@@PROCID)) + LEN('--// Version: ') + 1, 19)
3597
3598 SET @Parameters = '@Databases = ' + ISNULL('''' + REPLACE(@Databases,'''','''''') + '''','NULL')
3599 SET @Parameters = @Parameters + ', @CheckCommands = ' + ISNULL('''' + REPLACE(@CheckCommands,'''','''''') + '''','NULL')
3600 SET @Parameters = @Parameters + ', @PhysicalOnly = ' + ISNULL('''' + REPLACE(@PhysicalOnly,'''','''''') + '''','NULL')
3601 SET @Parameters = @Parameters + ', @NoIndex = ' + ISNULL('''' + REPLACE(@NoIndex,'''','''''') + '''','NULL')
3602 SET @Parameters = @Parameters + ', @ExtendedLogicalChecks = ' + ISNULL('''' + REPLACE(@ExtendedLogicalChecks,'''','''''') + '''','NULL')
3603 SET @Parameters = @Parameters + ', @TabLock = ' + ISNULL('''' + REPLACE(@TabLock,'''','''''') + '''','NULL')
3604 SET @Parameters = @Parameters + ', @FileGroups = ' + ISNULL('''' + REPLACE(@FileGroups,'''','''''') + '''','NULL')
3605 SET @Parameters = @Parameters + ', @Objects = ' + ISNULL('''' + REPLACE(@Objects,'''','''''') + '''','NULL')
3606 SET @Parameters = @Parameters + ', @MaxDOP = ' + ISNULL(CAST(@MaxDOP AS nvarchar),'NULL')
3607 SET @Parameters = @Parameters + ', @AvailabilityGroups = ' + ISNULL('''' + REPLACE(@AvailabilityGroups,'''','''''') + '''','NULL')
3608 SET @Parameters = @Parameters + ', @AvailabilityGroupReplicas = ' + ISNULL('''' + REPLACE(@AvailabilityGroupReplicas,'''','''''') + '''','NULL')
3609 SET @Parameters = @Parameters + ', @Updateability = ' + ISNULL('''' + REPLACE(@Updateability,'''','''''') + '''','NULL')
3610 SET @Parameters = @Parameters + ', @TimeLimit = ' + ISNULL(CAST(@TimeLimit AS nvarchar),'NULL')
3611 SET @Parameters = @Parameters + ', @LockTimeout = ' + ISNULL(CAST(@LockTimeout AS nvarchar),'NULL')
3612 SET @Parameters = @Parameters + ', @LockMessageSeverity = ' + ISNULL(CAST(@LockMessageSeverity AS nvarchar),'NULL')
3613 SET @Parameters = @Parameters + ', @DatabaseOrder = ' + ISNULL('''' + REPLACE(@DatabaseOrder,'''','''''') + '''','NULL')
3614 SET @Parameters = @Parameters + ', @DatabasesInParallel = ' + ISNULL('''' + REPLACE(@DatabasesInParallel,'''','''''') + '''','NULL')
3615 SET @Parameters = @Parameters + ', @LogToTable = ' + ISNULL('''' + REPLACE(@LogToTable,'''','''''') + '''','NULL')
3616 SET @Parameters = @Parameters + ', @Execute = ' + ISNULL('''' + REPLACE(@Execute,'''','''''') + '''','NULL')
3617
3618 SET @StartMessage = 'Date and time: ' + CONVERT(nvarchar,@StartTime,120)
3619 RAISERROR(@StartMessage,10,1) WITH NOWAIT
3620
3621 SET @StartMessage = 'Server: ' + CAST(SERVERPROPERTY('ServerName') AS nvarchar(max))
3622 RAISERROR(@StartMessage,10,1) WITH NOWAIT
3623
3624 SET @StartMessage = 'Version: ' + CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max))
3625 RAISERROR(@StartMessage,10,1) WITH NOWAIT
3626
3627 SET @StartMessage = 'Edition: ' + CAST(SERVERPROPERTY('Edition') AS nvarchar(max))
3628 RAISERROR(@StartMessage,10,1) WITH NOWAIT
3629
3630 SET @StartMessage = 'Platform: ' + @HostPlatform
3631 RAISERROR(@StartMessage,10,1) WITH NOWAIT
3632
3633 SET @StartMessage = 'Procedure: ' + QUOTENAME(DB_NAME(DB_ID())) + '.' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(@ObjectName)
3634 RAISERROR(@StartMessage,10,1) WITH NOWAIT
3635
3636 SET @StartMessage = 'Parameters: ' + @Parameters
3637 SET @StartMessage = REPLACE(@StartMessage,'%','%%')
3638 RAISERROR(@StartMessage,10,1) WITH NOWAIT
3639
3640 SET @StartMessage = 'Version: ' + @VersionTimestamp
3641 RAISERROR(@StartMessage,10,1) WITH NOWAIT
3642
3643 SET @StartMessage = 'Source: https://FixSQL.co.uk' + CHAR(13) + CHAR(10) + ' '
3644 RAISERROR(@StartMessage,10,1) WITH NOWAIT
3645
3646 ----------------------------------------------------------------------------------------------------
3647 --// Check core requirements //--
3648 ----------------------------------------------------------------------------------------------------
3649
3650 IF NOT (SELECT [compatibility_level] FROM sys.databases WHERE database_id = DB_ID()) >= 90
3651 BEGIN
3652 SET @ErrorMessage = 'The database ' + QUOTENAME(DB_NAME(DB_ID())) + ' has to be in compatibility level 90 or higher.' + CHAR(13) + CHAR(10) + ' '
3653 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
3654 SET @Error = @@ERROR
3655 END
3656
3657 IF NOT (SELECT uses_ansi_nulls FROM sys.sql_modules WHERE [object_id] = @@PROCID) = 1
3658 BEGIN
3659 SET @ErrorMessage = 'ANSI_NULLS has to be set to ON for the stored procedure.' + CHAR(13) + CHAR(10) + ' '
3660 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
3661 SET @Error = @@ERROR
3662 END
3663
3664 IF NOT (SELECT uses_quoted_identifier FROM sys.sql_modules WHERE [object_id] = @@PROCID) = 1
3665 BEGIN
3666 SET @ErrorMessage = 'QUOTED_IDENTIFIER has to be set to ON for the stored procedure.' + CHAR(13) + CHAR(10) + ' '
3667 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
3668 SET @Error = @@ERROR
3669 END
3670
3671 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')
3672 BEGIN
3673 SET @ErrorMessage = 'The stored procedure CommandExecute is missing. Download https://FixSQL.co.uk/scripts/CommandExecute.sql.' + CHAR(13) + CHAR(10) + ' '
3674 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
3675 SET @Error = @@ERROR
3676 END
3677
3678 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%')
3679 BEGIN
3680 SET @ErrorMessage = 'The stored procedure CommandExecute needs to be updated. Download https://FixSQL.co.uk/scripts/CommandExecute.sql.' + CHAR(13) + CHAR(10) + ' '
3681 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
3682 SET @Error = @@ERROR
3683 END
3684
3685 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')
3686 BEGIN
3687 SET @ErrorMessage = 'The table CommandLog is missing. Download https://FixSQL.co.uk/scripts/CommandLog.sql.' + CHAR(13) + CHAR(10) + ' '
3688 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
3689 SET @Error = @@ERROR
3690 END
3691
3692 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')
3693 BEGIN
3694 SET @ErrorMessage = 'The table Queue is missing. Download https://FixSQL.co.uk/scripts/Queue.sql.' + CHAR(13) + CHAR(10) + ' '
3695 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
3696 SET @Error = @@ERROR
3697 END
3698
3699 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')
3700 BEGIN
3701 SET @ErrorMessage = 'The table QueueDatabase is missing. Download https://FixSQL.co.uk/scripts/QueueDatabase.sql.' + CHAR(13) + CHAR(10) + ' '
3702 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
3703 SET @Error = @@ERROR
3704 END
3705
3706 IF @@TRANCOUNT <> 0
3707 BEGIN
3708 SET @ErrorMessage = 'The transaction count is not 0.' + CHAR(13) + CHAR(10) + ' '
3709 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
3710 SET @Error = @@ERROR
3711 END
3712
3713 IF @Error <> 0
3714 BEGIN
3715 SET @ReturnCode = @Error
3716 GOTO Logging
3717 END
3718
3719 ----------------------------------------------------------------------------------------------------
3720 --// Select databases //--
3721 ----------------------------------------------------------------------------------------------------
3722
3723 SET @Databases = REPLACE(@Databases, CHAR(10), '')
3724 SET @Databases = REPLACE(@Databases, CHAR(13), '')
3725
3726 WHILE CHARINDEX(', ',@Databases) > 0 SET @Databases = REPLACE(@Databases,', ',',')
3727 WHILE CHARINDEX(' ,',@Databases) > 0 SET @Databases = REPLACE(@Databases,' ,',',')
3728
3729 SET @Databases = LTRIM(RTRIM(@Databases));
3730
3731 WITH Databases1 (StartPosition, EndPosition, DatabaseItem) AS
3732 (
3733 SELECT 1 AS StartPosition,
3734 ISNULL(NULLIF(CHARINDEX(',', @Databases, 1), 0), LEN(@Databases) + 1) AS EndPosition,
3735 SUBSTRING(@Databases, 1, ISNULL(NULLIF(CHARINDEX(',', @Databases, 1), 0), LEN(@Databases) + 1) - 1) AS DatabaseItem
3736 WHERE @Databases IS NOT NULL
3737 UNION ALL
3738 SELECT CAST(EndPosition AS int) + 1 AS StartPosition,
3739 ISNULL(NULLIF(CHARINDEX(',', @Databases, EndPosition + 1), 0), LEN(@Databases) + 1) AS EndPosition,
3740 SUBSTRING(@Databases, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(',', @Databases, EndPosition + 1), 0), LEN(@Databases) + 1) - EndPosition - 1) AS DatabaseItem
3741 FROM Databases1
3742 WHERE EndPosition < LEN(@Databases) + 1
3743 ),
3744 Databases2 (DatabaseItem, StartPosition, Selected) AS
3745 (
3746 SELECT CASE WHEN DatabaseItem LIKE '-%' THEN RIGHT(DatabaseItem,LEN(DatabaseItem) - 1) ELSE DatabaseItem END AS DatabaseItem,
3747 StartPosition,
3748 CASE WHEN DatabaseItem LIKE '-%' THEN 0 ELSE 1 END AS Selected
3749 FROM Databases1
3750 ),
3751 Databases3 (DatabaseItem, DatabaseType, AvailabilityGroup, StartPosition, Selected) AS
3752 (
3753 SELECT CASE WHEN DatabaseItem IN('ALL_DATABASES','SYSTEM_DATABASES','USER_DATABASES','AVAILABILITY_GROUP_DATABASES') THEN '%' ELSE DatabaseItem END AS DatabaseItem,
3754 CASE WHEN DatabaseItem = 'SYSTEM_DATABASES' THEN 'S' WHEN DatabaseItem = 'USER_DATABASES' THEN 'U' ELSE NULL END AS DatabaseType,
3755 CASE WHEN DatabaseItem = 'AVAILABILITY_GROUP_DATABASES' THEN 1 ELSE NULL END AvailabilityGroup,
3756 StartPosition,
3757 Selected
3758 FROM Databases2
3759 ),
3760 Databases4 (DatabaseName, DatabaseType, AvailabilityGroup, StartPosition, Selected) AS
3761 (
3762 SELECT CASE WHEN LEFT(DatabaseItem,1) = '[' AND RIGHT(DatabaseItem,1) = ']' THEN PARSENAME(DatabaseItem,1) ELSE DatabaseItem END AS DatabaseItem,
3763 DatabaseType,
3764 AvailabilityGroup,
3765 StartPosition,
3766 Selected
3767 FROM Databases3
3768 )
3769 INSERT INTO @SelectedDatabases (DatabaseName, DatabaseType, AvailabilityGroup, StartPosition, Selected)
3770 SELECT DatabaseName,
3771 DatabaseType,
3772 AvailabilityGroup,
3773 StartPosition,
3774 Selected
3775 FROM Databases4
3776 OPTION (MAXRECURSION 0)
3777
3778 IF @Version >= 11 AND SERVERPROPERTY('IsHadrEnabled') = 1
3779 BEGIN
3780 INSERT INTO @tmpAvailabilityGroups (AvailabilityGroupName, Selected)
3781 SELECT name AS AvailabilityGroupName,
3782 0 AS Selected
3783 FROM sys.availability_groups
3784
3785 INSERT INTO @tmpDatabasesAvailabilityGroups (DatabaseName, AvailabilityGroupName)
3786 SELECT availability_databases_cluster.database_name, availability_groups.name
3787 FROM sys.availability_databases_cluster availability_databases_cluster
3788 INNER JOIN sys.availability_groups availability_groups ON availability_databases_cluster.group_id = availability_groups.group_id
3789 END
3790
3791 INSERT INTO @tmpDatabases (DatabaseName, DatabaseType, AvailabilityGroup, [Snapshot], [Order], Selected, Completed)
3792 SELECT [name] AS DatabaseName,
3793 CASE WHEN name IN('master','msdb','model') THEN 'S' ELSE 'U' END AS DatabaseType,
3794 NULL AS AvailabilityGroup,
3795 CASE WHEN source_database_id IS NOT NULL THEN 1 ELSE 0 END AS [Snapshot],
3796 0 AS [Order],
3797 0 AS Selected,
3798 0 AS Completed
3799 FROM sys.databases
3800 ORDER BY [name] ASC
3801
3802 UPDATE tmpDatabases
3803 SET AvailabilityGroup = CASE WHEN EXISTS (SELECT * FROM @tmpDatabasesAvailabilityGroups WHERE DatabaseName = tmpDatabases.DatabaseName) THEN 1 ELSE 0 END
3804 FROM @tmpDatabases tmpDatabases
3805
3806 UPDATE tmpDatabases
3807 SET tmpDatabases.Selected = SelectedDatabases.Selected
3808 FROM @tmpDatabases tmpDatabases
3809 INNER JOIN @SelectedDatabases SelectedDatabases
3810 ON tmpDatabases.DatabaseName LIKE REPLACE(SelectedDatabases.DatabaseName,'_','[_]')
3811 AND (tmpDatabases.DatabaseType = SelectedDatabases.DatabaseType OR SelectedDatabases.DatabaseType IS NULL)
3812 AND (tmpDatabases.AvailabilityGroup = SelectedDatabases.AvailabilityGroup OR SelectedDatabases.AvailabilityGroup IS NULL)
3813 AND NOT ((tmpDatabases.DatabaseName = 'tempdb' OR tmpDatabases.[Snapshot] = 1) AND tmpDatabases.DatabaseName <> SelectedDatabases.DatabaseName)
3814 WHERE SelectedDatabases.Selected = 1
3815
3816 UPDATE tmpDatabases
3817 SET tmpDatabases.Selected = SelectedDatabases.Selected
3818 FROM @tmpDatabases tmpDatabases
3819 INNER JOIN @SelectedDatabases SelectedDatabases
3820 ON tmpDatabases.DatabaseName LIKE REPLACE(SelectedDatabases.DatabaseName,'_','[_]')
3821 AND (tmpDatabases.DatabaseType = SelectedDatabases.DatabaseType OR SelectedDatabases.DatabaseType IS NULL)
3822 AND (tmpDatabases.AvailabilityGroup = SelectedDatabases.AvailabilityGroup OR SelectedDatabases.AvailabilityGroup IS NULL)
3823 AND NOT ((tmpDatabases.DatabaseName = 'tempdb' OR tmpDatabases.[Snapshot] = 1) AND tmpDatabases.DatabaseName <> SelectedDatabases.DatabaseName)
3824 WHERE SelectedDatabases.Selected = 0
3825
3826 UPDATE tmpDatabases
3827 SET tmpDatabases.StartPosition = SelectedDatabases2.StartPosition
3828 FROM @tmpDatabases tmpDatabases
3829 INNER JOIN (SELECT tmpDatabases.DatabaseName, MIN(SelectedDatabases.StartPosition) AS StartPosition
3830 FROM @tmpDatabases tmpDatabases
3831 INNER JOIN @SelectedDatabases SelectedDatabases
3832 ON tmpDatabases.DatabaseName LIKE REPLACE(SelectedDatabases.DatabaseName,'_','[_]')
3833 AND (tmpDatabases.DatabaseType = SelectedDatabases.DatabaseType OR SelectedDatabases.DatabaseType IS NULL)
3834 AND (tmpDatabases.AvailabilityGroup = SelectedDatabases.AvailabilityGroup OR SelectedDatabases.AvailabilityGroup IS NULL)
3835 WHERE SelectedDatabases.Selected = 1
3836 GROUP BY tmpDatabases.DatabaseName) SelectedDatabases2
3837 ON tmpDatabases.DatabaseName = SelectedDatabases2.DatabaseName
3838
3839 IF @Databases IS NOT NULL AND (NOT EXISTS(SELECT * FROM @SelectedDatabases) OR EXISTS(SELECT * FROM @SelectedDatabases WHERE DatabaseName IS NULL OR DatabaseName = ''))
3840 BEGIN
3841 SET @ErrorMessage = 'The value for the parameter @Databases is not supported.' + CHAR(13) + CHAR(10) + ' '
3842 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
3843 SET @Error = @@ERROR
3844 END
3845
3846 ----------------------------------------------------------------------------------------------------
3847 --// Select availability groups //--
3848 ----------------------------------------------------------------------------------------------------
3849
3850 IF @AvailabilityGroups IS NOT NULL AND @Version >= 11 AND SERVERPROPERTY('IsHadrEnabled') = 1
3851 BEGIN
3852
3853 SET @AvailabilityGroups = REPLACE(@AvailabilityGroups, CHAR(10), '')
3854 SET @AvailabilityGroups = REPLACE(@AvailabilityGroups, CHAR(13), '')
3855
3856 WHILE CHARINDEX(', ',@AvailabilityGroups) > 0 SET @AvailabilityGroups = REPLACE(@AvailabilityGroups,', ',',')
3857 WHILE CHARINDEX(' ,',@AvailabilityGroups) > 0 SET @AvailabilityGroups = REPLACE(@AvailabilityGroups,' ,',',')
3858
3859 SET @AvailabilityGroups = LTRIM(RTRIM(@AvailabilityGroups));
3860
3861 WITH AvailabilityGroups1 (StartPosition, EndPosition, AvailabilityGroupItem) AS
3862 (
3863 SELECT 1 AS StartPosition,
3864 ISNULL(NULLIF(CHARINDEX(',', @AvailabilityGroups, 1), 0), LEN(@AvailabilityGroups) + 1) AS EndPosition,
3865 SUBSTRING(@AvailabilityGroups, 1, ISNULL(NULLIF(CHARINDEX(',', @AvailabilityGroups, 1), 0), LEN(@AvailabilityGroups) + 1) - 1) AS AvailabilityGroupItem
3866 WHERE @AvailabilityGroups IS NOT NULL
3867 UNION ALL
3868 SELECT CAST(EndPosition AS int) + 1 AS StartPosition,
3869 ISNULL(NULLIF(CHARINDEX(',', @AvailabilityGroups, EndPosition + 1), 0), LEN(@AvailabilityGroups) + 1) AS EndPosition,
3870 SUBSTRING(@AvailabilityGroups, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(',', @AvailabilityGroups, EndPosition + 1), 0), LEN(@AvailabilityGroups) + 1) - EndPosition - 1) AS AvailabilityGroupItem
3871 FROM AvailabilityGroups1
3872 WHERE EndPosition < LEN(@AvailabilityGroups) + 1
3873 ),
3874 AvailabilityGroups2 (AvailabilityGroupItem, StartPosition, Selected) AS
3875 (
3876 SELECT CASE WHEN AvailabilityGroupItem LIKE '-%' THEN RIGHT(AvailabilityGroupItem,LEN(AvailabilityGroupItem) - 1) ELSE AvailabilityGroupItem END AS AvailabilityGroupItem,
3877 StartPosition,
3878 CASE WHEN AvailabilityGroupItem LIKE '-%' THEN 0 ELSE 1 END AS Selected
3879 FROM AvailabilityGroups1
3880 ),
3881 AvailabilityGroups3 (AvailabilityGroupItem, StartPosition, Selected) AS
3882 (
3883 SELECT CASE WHEN AvailabilityGroupItem = 'ALL_AVAILABILITY_GROUPS' THEN '%' ELSE AvailabilityGroupItem END AS AvailabilityGroupItem,
3884 StartPosition,
3885 Selected
3886 FROM AvailabilityGroups2
3887 ),
3888 AvailabilityGroups4 (AvailabilityGroupName, StartPosition, Selected) AS
3889 (
3890 SELECT CASE WHEN LEFT(AvailabilityGroupItem,1) = '[' AND RIGHT(AvailabilityGroupItem,1) = ']' THEN PARSENAME(AvailabilityGroupItem,1) ELSE AvailabilityGroupItem END AS AvailabilityGroupItem,
3891 StartPosition,
3892 Selected
3893 FROM AvailabilityGroups3
3894 )
3895 INSERT INTO @SelectedAvailabilityGroups (AvailabilityGroupName, StartPosition, Selected)
3896 SELECT AvailabilityGroupName, StartPosition, Selected
3897 FROM AvailabilityGroups4
3898 OPTION (MAXRECURSION 0)
3899
3900 UPDATE tmpAvailabilityGroups
3901 SET tmpAvailabilityGroups.Selected = SelectedAvailabilityGroups.Selected
3902 FROM @tmpAvailabilityGroups tmpAvailabilityGroups
3903 INNER JOIN @SelectedAvailabilityGroups SelectedAvailabilityGroups
3904 ON tmpAvailabilityGroups.AvailabilityGroupName LIKE REPLACE(SelectedAvailabilityGroups.AvailabilityGroupName,'_','[_]')
3905 WHERE SelectedAvailabilityGroups.Selected = 1
3906
3907 UPDATE tmpAvailabilityGroups
3908 SET tmpAvailabilityGroups.Selected = SelectedAvailabilityGroups.Selected
3909 FROM @tmpAvailabilityGroups tmpAvailabilityGroups
3910 INNER JOIN @SelectedAvailabilityGroups SelectedAvailabilityGroups
3911 ON tmpAvailabilityGroups.AvailabilityGroupName LIKE REPLACE(SelectedAvailabilityGroups.AvailabilityGroupName,'_','[_]')
3912 WHERE SelectedAvailabilityGroups.Selected = 0
3913
3914 UPDATE tmpAvailabilityGroups
3915 SET tmpAvailabilityGroups.StartPosition = SelectedAvailabilityGroups2.StartPosition
3916 FROM @tmpAvailabilityGroups tmpAvailabilityGroups
3917 INNER JOIN (SELECT tmpAvailabilityGroups.AvailabilityGroupName, MIN(SelectedAvailabilityGroups.StartPosition) AS StartPosition
3918 FROM @tmpAvailabilityGroups tmpAvailabilityGroups
3919 INNER JOIN @SelectedAvailabilityGroups SelectedAvailabilityGroups
3920 ON tmpAvailabilityGroups.AvailabilityGroupName LIKE REPLACE(SelectedAvailabilityGroups.AvailabilityGroupName,'_','[_]')
3921 WHERE SelectedAvailabilityGroups.Selected = 1
3922 GROUP BY tmpAvailabilityGroups.AvailabilityGroupName) SelectedAvailabilityGroups2
3923 ON tmpAvailabilityGroups.AvailabilityGroupName = SelectedAvailabilityGroups2.AvailabilityGroupName
3924
3925 UPDATE tmpDatabases
3926 SET tmpDatabases.StartPosition = tmpAvailabilityGroups.StartPosition,
3927 tmpDatabases.Selected = 1
3928 FROM @tmpDatabases tmpDatabases
3929 INNER JOIN @tmpDatabasesAvailabilityGroups tmpDatabasesAvailabilityGroups ON tmpDatabases.DatabaseName = tmpDatabasesAvailabilityGroups.DatabaseName
3930 INNER JOIN @tmpAvailabilityGroups tmpAvailabilityGroups ON tmpDatabasesAvailabilityGroups.AvailabilityGroupName = tmpAvailabilityGroups.AvailabilityGroupName
3931 WHERE tmpAvailabilityGroups.Selected = 1
3932
3933 END
3934
3935 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)
3936 BEGIN
3937 SET @ErrorMessage = 'The value for the parameter @AvailabilityGroups is not supported.' + CHAR(13) + CHAR(10) + ' '
3938 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
3939 SET @Error = @@ERROR
3940 END
3941
3942 IF (@Databases IS NULL AND @AvailabilityGroups IS NULL)
3943 BEGIN
3944 SET @ErrorMessage = 'You need to specify one of the parameters @Databases and @AvailabilityGroups.' + CHAR(13) + CHAR(10) + ' '
3945 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
3946 SET @Error = @@ERROR
3947 END
3948
3949 IF (@Databases IS NOT NULL AND @AvailabilityGroups IS NOT NULL)
3950 BEGIN
3951 SET @ErrorMessage = 'You can only specify one of the parameters @Databases and @AvailabilityGroups.' + CHAR(13) + CHAR(10) + ' '
3952 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
3953 SET @Error = @@ERROR
3954 END
3955
3956 ----------------------------------------------------------------------------------------------------
3957 --// Select filegroups //--
3958 ----------------------------------------------------------------------------------------------------
3959
3960 SET @FileGroups = REPLACE(@FileGroups, CHAR(10), '')
3961 SET @FileGroups = REPLACE(@FileGroups, CHAR(13), '')
3962
3963 WHILE CHARINDEX(', ',@FileGroups) > 0 SET @FileGroups = REPLACE(@FileGroups,', ',',')
3964 WHILE CHARINDEX(' ,',@FileGroups) > 0 SET @FileGroups = REPLACE(@FileGroups,' ,',',')
3965
3966 SET @FileGroups = LTRIM(RTRIM(@FileGroups));
3967
3968 WITH FileGroups1 (StartPosition, EndPosition, FileGroupItem) AS
3969 (
3970 SELECT 1 AS StartPosition,
3971 ISNULL(NULLIF(CHARINDEX(',', @FileGroups, 1), 0), LEN(@FileGroups) + 1) AS EndPosition,
3972 SUBSTRING(@FileGroups, 1, ISNULL(NULLIF(CHARINDEX(',', @FileGroups, 1), 0), LEN(@FileGroups) + 1) - 1) AS FileGroupItem
3973 WHERE @FileGroups IS NOT NULL
3974 UNION ALL
3975 SELECT CAST(EndPosition AS int) + 1 AS StartPosition,
3976 ISNULL(NULLIF(CHARINDEX(',', @FileGroups, EndPosition + 1), 0), LEN(@FileGroups) + 1) AS EndPosition,
3977 SUBSTRING(@FileGroups, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(',', @FileGroups, EndPosition + 1), 0), LEN(@FileGroups) + 1) - EndPosition - 1) AS FileGroupItem
3978 FROM FileGroups1
3979 WHERE EndPosition < LEN(@FileGroups) + 1
3980 ),
3981 FileGroups2 (FileGroupItem, StartPosition, Selected) AS
3982 (
3983 SELECT CASE WHEN FileGroupItem LIKE '-%' THEN RIGHT(FileGroupItem,LEN(FileGroupItem) - 1) ELSE FileGroupItem END AS FileGroupItem,
3984 StartPosition,
3985 CASE WHEN FileGroupItem LIKE '-%' THEN 0 ELSE 1 END AS Selected
3986 FROM FileGroups1
3987 ),
3988 FileGroups3 (FileGroupItem, StartPosition, Selected) AS
3989 (
3990 SELECT CASE WHEN FileGroupItem = 'ALL_FILEGROUPS' THEN '%.%' ELSE FileGroupItem END AS FileGroupItem,
3991 StartPosition,
3992 Selected
3993 FROM FileGroups2
3994 ),
3995 FileGroups4 (DatabaseName, FileGroupName, StartPosition, Selected) AS
3996 (
3997 SELECT CASE WHEN PARSENAME(FileGroupItem,4) IS NULL AND PARSENAME(FileGroupItem,3) IS NULL THEN PARSENAME(FileGroupItem,2) ELSE NULL END AS DatabaseName,
3998 CASE WHEN PARSENAME(FileGroupItem,4) IS NULL AND PARSENAME(FileGroupItem,3) IS NULL THEN PARSENAME(FileGroupItem,1) ELSE NULL END AS FileGroupName,
3999 StartPosition,
4000 Selected
4001 FROM FileGroups3
4002 )
4003 INSERT INTO @SelectedFileGroups (DatabaseName, FileGroupName, StartPosition, Selected)
4004 SELECT DatabaseName, FileGroupName, StartPosition, Selected
4005 FROM FileGroups4
4006 OPTION (MAXRECURSION 0)
4007
4008 ----------------------------------------------------------------------------------------------------
4009 --// Select objects //--
4010 ----------------------------------------------------------------------------------------------------
4011
4012 SET @Objects = REPLACE(@Objects, CHAR(10), '')
4013 SET @Objects = REPLACE(@Objects, CHAR(13), '')
4014
4015 WHILE CHARINDEX(', ',@Objects) > 0 SET @Objects = REPLACE(@Objects,', ',',')
4016 WHILE CHARINDEX(' ,',@Objects) > 0 SET @Objects = REPLACE(@Objects,' ,',',')
4017
4018 SET @Objects = LTRIM(RTRIM(@Objects));
4019
4020 WITH Objects1 (StartPosition, EndPosition, ObjectItem) AS
4021 (
4022 SELECT 1 AS StartPosition,
4023 ISNULL(NULLIF(CHARINDEX(',', @Objects, 1), 0), LEN(@Objects) + 1) AS EndPosition,
4024 SUBSTRING(@Objects, 1, ISNULL(NULLIF(CHARINDEX(',', @Objects, 1), 0), LEN(@Objects) + 1) - 1) AS ObjectItem
4025 WHERE @Objects IS NOT NULL
4026 UNION ALL
4027 SELECT CAST(EndPosition AS int) + 1 AS StartPosition,
4028 ISNULL(NULLIF(CHARINDEX(',', @Objects, EndPosition + 1), 0), LEN(@Objects) + 1) AS EndPosition,
4029 SUBSTRING(@Objects, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(',', @Objects, EndPosition + 1), 0), LEN(@Objects) + 1) - EndPosition - 1) AS ObjectItem
4030 FROM Objects1
4031 WHERE EndPosition < LEN(@Objects) + 1
4032 ),
4033 Objects2 (ObjectItem, StartPosition, Selected) AS
4034 (
4035 SELECT CASE WHEN ObjectItem LIKE '-%' THEN RIGHT(ObjectItem,LEN(ObjectItem) - 1) ELSE ObjectItem END AS ObjectItem,
4036 StartPosition,
4037 CASE WHEN ObjectItem LIKE '-%' THEN 0 ELSE 1 END AS Selected
4038 FROM Objects1
4039 ),
4040 Objects3 (ObjectItem, StartPosition, Selected) AS
4041 (
4042 SELECT CASE WHEN ObjectItem = 'ALL_OBJECTS' THEN '%.%.%' ELSE ObjectItem END AS ObjectItem,
4043 StartPosition,
4044 Selected
4045 FROM Objects2
4046 ),
4047 Objects4 (DatabaseName, SchemaName, ObjectName, StartPosition, Selected) AS
4048 (
4049 SELECT CASE WHEN PARSENAME(ObjectItem,4) IS NULL THEN PARSENAME(ObjectItem,3) ELSE NULL END AS DatabaseName,
4050 CASE WHEN PARSENAME(ObjectItem,4) IS NULL THEN PARSENAME(ObjectItem,2) ELSE NULL END AS SchemaName,
4051 CASE WHEN PARSENAME(ObjectItem,4) IS NULL THEN PARSENAME(ObjectItem,1) ELSE NULL END AS ObjectName,
4052 StartPosition,
4053 Selected
4054 FROM Objects3
4055 )
4056 INSERT INTO @SelectedObjects (DatabaseName, SchemaName, ObjectName, StartPosition, Selected)
4057 SELECT DatabaseName, SchemaName, ObjectName, StartPosition, Selected
4058 FROM Objects4
4059 OPTION (MAXRECURSION 0);
4060
4061 ----------------------------------------------------------------------------------------------------
4062 --// Select check commands //--
4063 ----------------------------------------------------------------------------------------------------
4064
4065 WITH CheckCommands (StartPosition, EndPosition, CheckCommand) AS
4066 (
4067 SELECT 1 AS StartPosition,
4068 ISNULL(NULLIF(CHARINDEX(',', @CheckCommands, 1), 0), LEN(@CheckCommands) + 1) AS EndPosition,
4069 SUBSTRING(@CheckCommands, 1, ISNULL(NULLIF(CHARINDEX(',', @CheckCommands, 1), 0), LEN(@CheckCommands) + 1) - 1) AS CheckCommand
4070 WHERE @CheckCommands IS NOT NULL
4071 UNION ALL
4072 SELECT CAST(EndPosition AS int) + 1 AS StartPosition,
4073 ISNULL(NULLIF(CHARINDEX(',', @CheckCommands, EndPosition + 1), 0), LEN(@CheckCommands) + 1) AS EndPosition,
4074 SUBSTRING(@CheckCommands, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(',', @CheckCommands, EndPosition + 1), 0), LEN(@CheckCommands) + 1) - EndPosition - 1) AS CheckCommand
4075 FROM CheckCommands
4076 WHERE EndPosition < LEN(@CheckCommands) + 1
4077 )
4078 INSERT INTO @SelectedCheckCommands (CheckCommand)
4079 SELECT CheckCommand
4080 FROM CheckCommands
4081 OPTION (MAXRECURSION 0)
4082
4083 ----------------------------------------------------------------------------------------------------
4084 --// Check input parameters //--
4085 ----------------------------------------------------------------------------------------------------
4086
4087 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')))
4088 BEGIN
4089 SET @ErrorMessage = 'The value for the parameter @CheckCommands is not supported.' + CHAR(13) + CHAR(10) + ' '
4090 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
4091 SET @Error = @@ERROR
4092 END
4093
4094 IF @PhysicalOnly NOT IN ('Y','N') OR @PhysicalOnly IS NULL
4095 BEGIN
4096 SET @ErrorMessage = 'The value for the parameter @PhysicalOnly is not supported.' + CHAR(13) + CHAR(10) + ' '
4097 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
4098 SET @Error = @@ERROR
4099 END
4100
4101 IF @NoIndex NOT IN ('Y','N') OR @NoIndex IS NULL
4102 BEGIN
4103 SET @ErrorMessage = 'The value for the parameter @NoIndex is not supported.' + CHAR(13) + CHAR(10) + ' '
4104 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
4105 SET @Error = @@ERROR
4106 END
4107
4108 IF @ExtendedLogicalChecks NOT IN ('Y','N') OR @ExtendedLogicalChecks IS NULL OR (@ExtendedLogicalChecks = 'Y' AND NOT @Version >= 10) OR (@PhysicalOnly = 'Y' AND @ExtendedLogicalChecks = 'Y')
4109 BEGIN
4110 SET @ErrorMessage = 'The value for the parameter @ExtendedLogicalChecks is not supported.' + CHAR(13) + CHAR(10) + ' '
4111 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
4112 SET @Error = @@ERROR
4113 END
4114
4115 IF @TabLock NOT IN ('Y','N') OR @TabLock IS NULL
4116 BEGIN
4117 SET @ErrorMessage = 'The value for the parameter @TabLock is not supported.' + CHAR(13) + CHAR(10) + ' '
4118 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
4119 SET @Error = @@ERROR
4120 END
4121
4122 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'))
4123 BEGIN
4124 SET @ErrorMessage = 'The value for the parameter @FileGroups is not supported.' + CHAR(13) + CHAR(10) + ' '
4125 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
4126 SET @Error = @@ERROR
4127 END
4128
4129 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'))
4130 BEGIN
4131 SET @ErrorMessage = 'The value for the parameter @Objects is not supported.' + CHAR(13) + CHAR(10) + ' '
4132 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
4133 SET @Error = @@ERROR
4134 END
4135
4136 IF @MaxDOP < 0 OR @MaxDOP > 64 OR (@MaxDOP IS NOT NULL AND NOT (@Version >= 12.050000 OR SERVERPROPERTY('EngineEdition') IN (5, 8)))
4137 BEGIN
4138 SET @ErrorMessage = 'The value for the parameter @MaxDOP is not supported.' + CHAR(13) + CHAR(10) + ' '
4139 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
4140 SET @Error = @@ERROR
4141 END
4142
4143 IF @AvailabilityGroupReplicas NOT IN('ALL','PRIMARY','SECONDARY','PREFERRED_BACKUP_REPLICA') OR @AvailabilityGroupReplicas IS NULL
4144 BEGIN
4145 SET @ErrorMessage = 'The value for the parameter @AvailabilityGroupReplicas is not supported.' + CHAR(13) + CHAR(10) + ' '
4146 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
4147 SET @Error = @@ERROR
4148 END
4149
4150 IF @Updateability NOT IN('READ_ONLY','READ_WRITE','ALL') OR @Updateability IS NULL
4151 BEGIN
4152 SET @ErrorMessage = 'The value for the parameter @Updateability is not supported.' + CHAR(13) + CHAR(10) + ' '
4153 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
4154 SET @Error = @@ERROR
4155 END
4156
4157 IF @TimeLimit < 0
4158 BEGIN
4159 SET @ErrorMessage = 'The value for the parameter @TimeLimit is not supported.' + CHAR(13) + CHAR(10) + ' '
4160 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
4161 SET @Error = @@ERROR
4162 END
4163
4164 IF @LockTimeout < 0
4165 BEGIN
4166 SET @ErrorMessage = 'The value for the parameter @LockTimeout is not supported.' + CHAR(13) + CHAR(10) + ' '
4167 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
4168 SET @Error = @@ERROR
4169 END
4170
4171 IF @LockMessageSeverity NOT IN(10,16)
4172 BEGIN
4173 SET @ErrorMessage = 'The value for the parameter @LockMessageSeverity is not supported.' + CHAR(13) + CHAR(10) + ' '
4174 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
4175 SET @Error = @@ERROR
4176 END
4177
4178 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 >= 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)
4179 BEGIN
4180 SET @ErrorMessage = 'The value for the parameter @DatabaseOrder is not supported.' + CHAR(13) + CHAR(10) + ' '
4181 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
4182 SET @Error = @@ERROR
4183 END
4184
4185 IF @DatabasesInParallel NOT IN('Y','N') OR @DatabasesInParallel IS NULL OR (@DatabasesInParallel = 'Y' AND SERVERPROPERTY('EngineEdition') = 5)
4186 BEGIN
4187 SET @ErrorMessage = 'The value for the parameter @DatabasesInParallel is not supported.' + CHAR(13) + CHAR(10) + ' '
4188 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
4189 SET @Error = @@ERROR
4190 END
4191
4192 IF @LogToTable NOT IN('Y','N') OR @LogToTable IS NULL
4193 BEGIN
4194 SET @ErrorMessage = 'The value for the parameter @LogToTable is not supported.' + CHAR(13) + CHAR(10) + ' '
4195 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
4196 SET @Error = @@ERROR
4197 END
4198
4199 IF @Execute NOT IN('Y','N') OR @Execute IS NULL
4200 BEGIN
4201 SET @ErrorMessage = 'The value for the parameter @Execute is not supported.' + CHAR(13) + CHAR(10) + ' '
4202 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
4203 SET @Error = @@ERROR
4204 END
4205
4206 IF @Error <> 0
4207 BEGIN
4208 SET @ErrorMessage = 'The documentation is available at https://FixSQL.co.uk/sql-server-integrity-check.html.' + CHAR(13) + CHAR(10) + ' '
4209 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
4210 SET @ReturnCode = @Error
4211 GOTO Logging
4212 END
4213
4214 ----------------------------------------------------------------------------------------------------
4215 --// Check that selected databases and availability groups exist //--
4216 ----------------------------------------------------------------------------------------------------
4217
4218 SET @ErrorMessage = ''
4219 SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + ', '
4220 FROM @SelectedDatabases
4221 WHERE DatabaseName NOT LIKE '%[%]%'
4222 AND DatabaseName NOT IN (SELECT DatabaseName FROM @tmpDatabases)
4223 IF @@ROWCOUNT > 0
4224 BEGIN
4225 SET @ErrorMessage = 'The following databases in the @Databases parameter do not exist: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.' + CHAR(13) + CHAR(10) + ' '
4226 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
4227 SET @Error = @@ERROR
4228 END
4229
4230 SET @ErrorMessage = ''
4231 SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + ', '
4232 FROM @SelectedFileGroups
4233 WHERE DatabaseName NOT LIKE '%[%]%'
4234 AND DatabaseName NOT IN (SELECT DatabaseName FROM @tmpDatabases)
4235 IF @@ROWCOUNT > 0
4236 BEGIN
4237 SET @ErrorMessage = 'The following databases in the @FileGroups parameter do not exist: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.' + CHAR(13) + CHAR(10) + ' '
4238 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
4239 SET @Error = @@ERROR
4240 END
4241
4242 SET @ErrorMessage = ''
4243 SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + ', '
4244 FROM @SelectedObjects
4245 WHERE DatabaseName NOT LIKE '%[%]%'
4246 AND DatabaseName NOT IN (SELECT DatabaseName FROM @tmpDatabases)
4247 IF @@ROWCOUNT > 0
4248 BEGIN
4249 SET @ErrorMessage = 'The following databases in the @Objects parameter do not exist: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.' + CHAR(13) + CHAR(10) + ' '
4250 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
4251 SET @Error = @@ERROR
4252 END
4253
4254 SET @ErrorMessage = ''
4255 SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(AvailabilityGroupName) + ', '
4256 FROM @SelectedAvailabilityGroups
4257 WHERE AvailabilityGroupName NOT LIKE '%[%]%'
4258 AND AvailabilityGroupName NOT IN (SELECT AvailabilityGroupName FROM @tmpAvailabilityGroups)
4259 IF @@ROWCOUNT > 0
4260 BEGIN
4261 SET @ErrorMessage = 'The following availability groups do not exist: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.' + CHAR(13) + CHAR(10) + ' '
4262 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
4263 SET @Error = @@ERROR
4264 END
4265
4266 SET @ErrorMessage = ''
4267 SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + ', '
4268 FROM @SelectedFileGroups
4269 WHERE DatabaseName NOT LIKE '%[%]%'
4270 AND DatabaseName IN (SELECT DatabaseName FROM @tmpDatabases)
4271 AND DatabaseName NOT IN (SELECT DatabaseName FROM @tmpDatabases WHERE Selected = 1)
4272 IF @@ROWCOUNT > 0
4273 BEGIN
4274 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) + '.' + CHAR(13) + CHAR(10) + ' '
4275 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
4276 SET @Error = @@ERROR
4277 END
4278
4279 SET @ErrorMessage = ''
4280 SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + ', '
4281 FROM @SelectedObjects
4282 WHERE DatabaseName NOT LIKE '%[%]%'
4283 AND DatabaseName IN (SELECT DatabaseName FROM @tmpDatabases)
4284 AND DatabaseName NOT IN (SELECT DatabaseName FROM @tmpDatabases WHERE Selected = 1)
4285 IF @@ROWCOUNT > 0
4286 BEGIN
4287 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) + '.' + CHAR(13) + CHAR(10) + ' '
4288 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
4289 SET @Error = @@ERROR
4290 END
4291
4292 ----------------------------------------------------------------------------------------------------
4293 --// Check @@SERVERNAME //--
4294 ----------------------------------------------------------------------------------------------------
4295
4296 IF @@SERVERNAME <> CAST(SERVERPROPERTY('ServerName') AS nvarchar(max)) AND SERVERPROPERTY('IsHadrEnabled') = 1
4297 BEGIN
4298 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 + '.' + CHAR(13) + CHAR(10) + ' '
4299 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
4300 SET @Error = @@ERROR
4301 END
4302
4303 ----------------------------------------------------------------------------------------------------
4304 --// Update database order //--
4305 ----------------------------------------------------------------------------------------------------
4306
4307 IF @DatabaseOrder IN('DATABASE_SIZE_ASC','DATABASE_SIZE_DESC')
4308 BEGIN
4309 UPDATE tmpDatabases
4310 SET DatabaseSize = (SELECT SUM(size) FROM sys.master_files WHERE [type] = 0 AND database_id = DB_ID(tmpDatabases.DatabaseName))
4311 FROM @tmpDatabases tmpDatabases
4312 END
4313
4314 IF @DatabaseOrder IN('DATABASE_LAST_GOOD_CHECK_ASC','DATABASE_LAST_GOOD_CHECK_DESC')
4315 BEGIN
4316 UPDATE tmpDatabases
4317 SET LastGoodCheckDbTime = NULLIF(CAST(DATABASEPROPERTYEX (DatabaseName,'LastGoodCheckDbTime') AS datetime),'1900-01-01 00:00:00.000')
4318 FROM @tmpDatabases tmpDatabases
4319 END
4320
4321 IF @DatabaseOrder IN('REPLICA_LAST_GOOD_CHECK_ASC','REPLICA_LAST_GOOD_CHECK_DESC')
4322 BEGIN
4323 UPDATE tmpDatabases
4324 SET LastCommandTime = MaxStartTime
4325 FROM @tmpDatabases tmpDatabases
4326 INNER JOIN (SELECT DatabaseName, MAX(StartTime) AS MaxStartTime
4327 FROM dbo.CommandLog
4328 WHERE CommandType = 'DBCC_CHECKDB'
4329 AND ErrorNumber = 0
4330 GROUP BY DatabaseName) CommandLog
4331 ON tmpDatabases.DatabaseName = CommandLog.DatabaseName COLLATE DATABASE_DEFAULT
4332 END
4333
4334 IF @DatabaseOrder IS NULL
4335 BEGIN
4336 WITH tmpDatabases AS (
4337 SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY StartPosition ASC, DatabaseName ASC) AS RowNumber
4338 FROM @tmpDatabases tmpDatabases
4339 WHERE Selected = 1
4340 )
4341 UPDATE tmpDatabases
4342 SET [Order] = RowNumber
4343 END
4344 ELSE
4345 IF @DatabaseOrder = 'DATABASE_NAME_ASC'
4346 BEGIN
4347 WITH tmpDatabases AS (
4348 SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY DatabaseName ASC) AS RowNumber
4349 FROM @tmpDatabases tmpDatabases
4350 WHERE Selected = 1
4351 )
4352 UPDATE tmpDatabases
4353 SET [Order] = RowNumber
4354 END
4355 ELSE
4356 IF @DatabaseOrder = 'DATABASE_NAME_DESC'
4357 BEGIN
4358 WITH tmpDatabases AS (
4359 SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY DatabaseName DESC) AS RowNumber
4360 FROM @tmpDatabases tmpDatabases
4361 WHERE Selected = 1
4362 )
4363 UPDATE tmpDatabases
4364 SET [Order] = RowNumber
4365 END
4366 ELSE
4367 IF @DatabaseOrder = 'DATABASE_SIZE_ASC'
4368 BEGIN
4369 WITH tmpDatabases AS (
4370 SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY DatabaseSize ASC) AS RowNumber
4371 FROM @tmpDatabases tmpDatabases
4372 WHERE Selected = 1
4373 )
4374 UPDATE tmpDatabases
4375 SET [Order] = RowNumber
4376 END
4377 ELSE
4378 IF @DatabaseOrder = 'DATABASE_SIZE_DESC'
4379 BEGIN
4380 WITH tmpDatabases AS (
4381 SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY DatabaseSize DESC) AS RowNumber
4382 FROM @tmpDatabases tmpDatabases
4383 WHERE Selected = 1
4384 )
4385 UPDATE tmpDatabases
4386 SET [Order] = RowNumber
4387 END
4388 ELSE
4389 IF @DatabaseOrder = 'DATABASE_LAST_GOOD_CHECK_ASC'
4390 BEGIN
4391 WITH tmpDatabases AS (
4392 SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY LastGoodCheckDbTime ASC) AS RowNumber
4393 FROM @tmpDatabases tmpDatabases
4394 WHERE Selected = 1
4395 )
4396 UPDATE tmpDatabases
4397 SET [Order] = RowNumber
4398 END
4399 ELSE
4400 IF @DatabaseOrder = 'DATABASE_LAST_GOOD_CHECK_DESC'
4401 BEGIN
4402 WITH tmpDatabases AS (
4403 SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY LastGoodCheckDbTime DESC) AS RowNumber
4404 FROM @tmpDatabases tmpDatabases
4405 WHERE Selected = 1
4406 )
4407 UPDATE tmpDatabases
4408 SET [Order] = RowNumber
4409 END
4410 ELSE
4411 IF @DatabaseOrder = 'REPLICA_LAST_GOOD_CHECK_ASC'
4412 BEGIN
4413 WITH tmpDatabases AS (
4414 SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY LastCommandTime ASC) AS RowNumber
4415 FROM @tmpDatabases tmpDatabases
4416 WHERE Selected = 1
4417 )
4418 UPDATE tmpDatabases
4419 SET [Order] = RowNumber
4420 END
4421 ELSE
4422 IF @DatabaseOrder = 'REPLICA_LAST_GOOD_CHECK_DESC'
4423 BEGIN
4424 WITH tmpDatabases AS (
4425 SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY LastCommandTime DESC) AS RowNumber
4426 FROM @tmpDatabases tmpDatabases
4427 WHERE Selected = 1
4428 )
4429 UPDATE tmpDatabases
4430 SET [Order] = RowNumber
4431 END
4432
4433 ----------------------------------------------------------------------------------------------------
4434 --// Update the queue //--
4435 ----------------------------------------------------------------------------------------------------
4436
4437 IF @DatabasesInParallel = 'Y'
4438 BEGIN
4439
4440 BEGIN TRY
4441
4442 SELECT @QueueID = QueueID
4443 FROM dbo.[Queue]
4444 WHERE SchemaName = @SchemaName
4445 AND ObjectName = @ObjectName
4446 AND [Parameters] = @Parameters
4447
4448 IF @QueueID IS NULL
4449 BEGIN
4450 BEGIN TRANSACTION
4451
4452 SELECT @QueueID = QueueID
4453 FROM dbo.[Queue] WITH (UPDLOCK, TABLOCK)
4454 WHERE SchemaName = @SchemaName
4455 AND ObjectName = @ObjectName
4456 AND [Parameters] = @Parameters
4457
4458 IF @QueueID IS NULL
4459 BEGIN
4460 INSERT INTO dbo.[Queue] (SchemaName, ObjectName, [Parameters])
4461 SELECT @SchemaName, @ObjectName, @Parameters
4462
4463 SET @QueueID = SCOPE_IDENTITY()
4464 END
4465
4466 COMMIT TRANSACTION
4467 END
4468
4469 BEGIN TRANSACTION
4470
4471 UPDATE [Queue]
4472 SET QueueStartTime = GETDATE(),
4473 SessionID = @@SPID,
4474 RequestID = (SELECT request_id FROM sys.dm_exec_requests WHERE session_id = @@SPID),
4475 RequestStartTime = (SELECT start_time FROM sys.dm_exec_requests WHERE session_id = @@SPID)
4476 FROM dbo.[Queue] [Queue]
4477 WHERE QueueID = @QueueID
4478 AND NOT EXISTS (SELECT *
4479 FROM sys.dm_exec_requests
4480 WHERE session_id = [Queue].SessionID
4481 AND request_id = [Queue].RequestID
4482 AND start_time = [Queue].RequestStartTime)
4483 AND NOT EXISTS (SELECT *
4484 FROM dbo.QueueDatabase QueueDatabase
4485 INNER JOIN sys.dm_exec_requests ON QueueDatabase.SessionID = session_id AND QueueDatabase.RequestID = request_id AND QueueDatabase.RequestStartTime = start_time
4486 WHERE QueueDatabase.QueueID = @QueueID)
4487
4488 IF @@ROWCOUNT = 1
4489 BEGIN
4490 INSERT INTO dbo.QueueDatabase (QueueID, DatabaseName)
4491 SELECT @QueueID AS QueueID,
4492 DatabaseName
4493 FROM @tmpDatabases tmpDatabases
4494 WHERE Selected = 1
4495 AND NOT EXISTS (SELECT * FROM dbo.QueueDatabase WHERE DatabaseName = tmpDatabases.DatabaseName AND QueueID = @QueueID)
4496
4497 DELETE QueueDatabase
4498 FROM dbo.QueueDatabase QueueDatabase
4499 WHERE QueueID = @QueueID
4500 AND NOT EXISTS (SELECT * FROM @tmpDatabases tmpDatabases WHERE DatabaseName = QueueDatabase.DatabaseName AND Selected = 1)
4501
4502 UPDATE QueueDatabase
4503 SET DatabaseOrder = tmpDatabases.[Order]
4504 FROM dbo.QueueDatabase QueueDatabase
4505 INNER JOIN @tmpDatabases tmpDatabases ON QueueDatabase.DatabaseName = tmpDatabases.DatabaseName
4506 WHERE QueueID = @QueueID
4507 END
4508
4509 COMMIT TRANSACTION
4510
4511 SELECT @QueueStartTime = QueueStartTime
4512 FROM dbo.[Queue]
4513 WHERE QueueID = @QueueID
4514
4515 END TRY
4516
4517 BEGIN CATCH
4518 IF XACT_STATE() <> 0
4519 BEGIN
4520 ROLLBACK TRANSACTION
4521 END
4522 SET @ErrorMessage = 'Msg ' + CAST(ERROR_NUMBER() AS nvarchar) + ', ' + ISNULL(ERROR_MESSAGE(),'') + CHAR(13) + CHAR(10) + ' '
4523 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
4524 SET @ReturnCode = ERROR_NUMBER()
4525 GOTO Logging
4526 END CATCH
4527
4528 END
4529
4530 ----------------------------------------------------------------------------------------------------
4531 --// Execute commands //--
4532 ----------------------------------------------------------------------------------------------------
4533
4534 WHILE (1 = 1)
4535 BEGIN
4536
4537 IF @DatabasesInParallel = 'Y'
4538 BEGIN
4539 UPDATE QueueDatabase
4540 SET DatabaseStartTime = NULL,
4541 SessionID = NULL,
4542 RequestID = NULL,
4543 RequestStartTime = NULL
4544 FROM dbo.QueueDatabase QueueDatabase
4545 WHERE QueueID = @QueueID
4546 AND DatabaseStartTime IS NOT NULL
4547 AND DatabaseEndTime IS NULL
4548 AND NOT EXISTS (SELECT * FROM sys.dm_exec_requests WHERE session_id = QueueDatabase.SessionID AND request_id = QueueDatabase.RequestID AND start_time = QueueDatabase.RequestStartTime)
4549
4550 UPDATE QueueDatabase
4551 SET DatabaseStartTime = GETDATE(),
4552 DatabaseEndTime = NULL,
4553 SessionID = @@SPID,
4554 RequestID = (SELECT request_id FROM sys.dm_exec_requests WHERE session_id = @@SPID),
4555 RequestStartTime = (SELECT start_time FROM sys.dm_exec_requests WHERE session_id = @@SPID),
4556 @CurrentDatabaseName = DatabaseName
4557 FROM (SELECT TOP 1 DatabaseStartTime,
4558 DatabaseEndTime,
4559 SessionID,
4560 RequestID,
4561 RequestStartTime,
4562 DatabaseName
4563 FROM dbo.QueueDatabase
4564 WHERE QueueID = @QueueID
4565 AND (DatabaseStartTime < @QueueStartTime OR DatabaseStartTime IS NULL)
4566 AND NOT (DatabaseStartTime IS NOT NULL AND DatabaseEndTime IS NULL)
4567 ORDER BY DatabaseOrder ASC
4568 ) QueueDatabase
4569 END
4570 ELSE
4571 BEGIN
4572 SELECT TOP 1 @CurrentDBID = ID,
4573 @CurrentDatabaseName = DatabaseName
4574 FROM @tmpDatabases
4575 WHERE Selected = 1
4576 AND Completed = 0
4577 ORDER BY [Order] ASC
4578 END
4579
4580 IF @@ROWCOUNT = 0
4581 BEGIN
4582 BREAK
4583 END
4584
4585 SET @CurrentDatabaseID = DB_ID(@CurrentDatabaseName)
4586
4587 IF DATABASEPROPERTYEX(@CurrentDatabaseName,'Status') = 'ONLINE' AND SERVERPROPERTY('EngineEdition') <> 5
4588 BEGIN
4589 IF EXISTS (SELECT * FROM sys.database_recovery_status WHERE database_id = @CurrentDatabaseID AND database_guid IS NOT NULL)
4590 BEGIN
4591 SET @CurrentIsDatabaseAccessible = 1
4592 END
4593 ELSE
4594 BEGIN
4595 SET @CurrentIsDatabaseAccessible = 0
4596 END
4597 END
4598
4599 IF @Version >= 11 AND SERVERPROPERTY('IsHadrEnabled') = 1
4600 BEGIN
4601 SELECT @CurrentAvailabilityGroup = availability_groups.name,
4602 @CurrentAvailabilityGroupRole = dm_hadr_availability_replica_states.role_desc,
4603 @CurrentAvailabilityGroupBackupPreference = UPPER(availability_groups.automated_backup_preference_desc)
4604 FROM sys.databases databases
4605 INNER JOIN sys.availability_databases_cluster availability_databases_cluster ON databases.group_database_id = availability_databases_cluster.group_database_id
4606 INNER JOIN sys.availability_groups availability_groups ON availability_databases_cluster.group_id = availability_groups.group_id
4607 INNER JOIN sys.dm_hadr_availability_replica_states dm_hadr_availability_replica_states ON availability_groups.group_id = dm_hadr_availability_replica_states.group_id AND databases.replica_id = dm_hadr_availability_replica_states.replica_id
4608 WHERE databases.name = @CurrentDatabaseName
4609 END
4610
4611 IF @Version >= 11 AND SERVERPROPERTY('IsHadrEnabled') = 1 AND @CurrentAvailabilityGroup IS NOT NULL AND @AvailabilityGroupReplicas = 'PREFERRED_BACKUP_REPLICA'
4612 BEGIN
4613 SELECT @CurrentIsPreferredBackupReplica = sys.fn_hadr_backup_is_preferred_replica(@CurrentDatabaseName)
4614 END
4615
4616 IF SERVERPROPERTY('EngineEdition') <> 5
4617 BEGIN
4618 SELECT @CurrentDatabaseMirroringRole = UPPER(mirroring_role_desc)
4619 FROM sys.database_mirroring
4620 WHERE database_id = @CurrentDatabaseID
4621 END
4622
4623 SELECT @CurrentIsReadOnly = is_read_only
4624 FROM sys.databases
4625 WHERE name = @CurrentDatabaseName
4626
4627 SET @DatabaseMessage = 'Date and time: ' + CONVERT(nvarchar,GETDATE(),120)
4628 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
4629
4630 SET @DatabaseMessage = 'Database: ' + QUOTENAME(@CurrentDatabaseName)
4631 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
4632
4633 SET @DatabaseMessage = 'Status: ' + CAST(DATABASEPROPERTYEX(@CurrentDatabaseName,'Status') AS nvarchar)
4634 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
4635
4636 SET @DatabaseMessage = 'Standby: ' + CASE WHEN DATABASEPROPERTYEX(@CurrentDatabaseName,'IsInStandBy') = 1 THEN 'Yes' ELSE 'No' END
4637 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
4638
4639 SET @DatabaseMessage = 'Updateability: ' + CASE WHEN @CurrentIsReadOnly = 1 THEN 'READ_ONLY' WHEN @CurrentIsReadOnly = 0 THEN 'READ_WRITE' END
4640 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
4641
4642 SET @DatabaseMessage = 'User access: ' + CAST(DATABASEPROPERTYEX(@CurrentDatabaseName,'UserAccess') AS nvarchar)
4643 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
4644
4645 IF @CurrentIsDatabaseAccessible IS NOT NULL
4646 BEGIN
4647 SET @DatabaseMessage = 'Is accessible: ' + CASE WHEN @CurrentIsDatabaseAccessible = 1 THEN 'Yes' ELSE 'No' END
4648 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
4649 END
4650
4651 SET @DatabaseMessage = 'Recovery model: ' + CAST(DATABASEPROPERTYEX(@CurrentDatabaseName,'Recovery') AS nvarchar)
4652 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
4653
4654 IF @CurrentAvailabilityGroup IS NOT NULL
4655 BEGIN
4656 SET @DatabaseMessage = 'Availability group: ' + @CurrentAvailabilityGroup
4657 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
4658
4659 SET @DatabaseMessage = 'Availability group role: ' + @CurrentAvailabilityGroupRole
4660 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
4661
4662 IF @AvailabilityGroupReplicas = 'PREFERRED_BACKUP_REPLICA'
4663 BEGIN
4664 SET @DatabaseMessage = 'Availability group backup preference: ' + @CurrentAvailabilityGroupBackupPreference
4665 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
4666
4667 SET @DatabaseMessage = 'Is preferred backup replica: ' + CASE WHEN @CurrentIsPreferredBackupReplica = 1 THEN 'Yes' WHEN @CurrentIsPreferredBackupReplica = 0 THEN 'No' ELSE 'N/A' END
4668 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
4669 END
4670 END
4671
4672 IF @CurrentDatabaseMirroringRole IS NOT NULL
4673 BEGIN
4674 SET @DatabaseMessage = 'Database mirroring role: ' + @CurrentDatabaseMirroringRole
4675 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
4676 END
4677
4678 RAISERROR('',10,1) WITH NOWAIT
4679
4680 IF DATABASEPROPERTYEX(@CurrentDatabaseName,'Status') = 'ONLINE'
4681 AND (@CurrentIsDatabaseAccessible = 1 OR @CurrentIsDatabaseAccessible IS NULL)
4682 AND (@CurrentAvailabilityGroupRole = 'PRIMARY' OR @CurrentAvailabilityGroupRole IS NULL OR SERVERPROPERTY('EngineEdition') = 3)
4683 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)
4684 AND NOT (@CurrentIsReadOnly = 1 AND @Updateability = 'READ_WRITE')
4685 AND NOT (@CurrentIsReadOnly = 0 AND @Updateability = 'READ_ONLY')
4686 BEGIN
4687
4688 -- Check database
4689 IF EXISTS(SELECT * FROM @SelectedCheckCommands WHERE CheckCommand = 'CHECKDB') AND (GETDATE() < DATEADD(ss,@TimeLimit,@StartTime) OR @TimeLimit IS NULL)
4690 BEGIN
4691 SET @CurrentCommandType01 = 'DBCC_CHECKDB'
4692
4693 SET @CurrentCommand01 = ''
4694 IF @LockTimeout IS NOT NULL SET @CurrentCommand01 = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; '
4695 SET @CurrentCommand01 = @CurrentCommand01 + 'DBCC CHECKDB (' + QUOTENAME(@CurrentDatabaseName)
4696 IF @NoIndex = 'Y' SET @CurrentCommand01 = @CurrentCommand01 + ', NOINDEX'
4697 SET @CurrentCommand01 = @CurrentCommand01 + ') WITH NO_INFOMSGS, ALL_ERRORMSGS'
4698 IF @PhysicalOnly = 'N' SET @CurrentCommand01 = @CurrentCommand01 + ', DATA_PURITY'
4699 IF @PhysicalOnly = 'Y' SET @CurrentCommand01 = @CurrentCommand01 + ', PHYSICAL_ONLY'
4700 IF @ExtendedLogicalChecks = 'Y' SET @CurrentCommand01 = @CurrentCommand01 + ', EXTENDED_LOGICAL_CHECKS'
4701 IF @TabLock = 'Y' SET @CurrentCommand01 = @CurrentCommand01 + ', TABLOCK'
4702 IF @MaxDOP IS NOT NULL SET @CurrentCommand01 = @CurrentCommand01 + ', MAXDOP = ' + CAST(@MaxDOP AS nvarchar)
4703
4704 EXECUTE @CurrentCommandOutput01 = [dbo].[CommandExecute] @Command = @CurrentCommand01, @CommandType = @CurrentCommandType01, @Mode = 1, @DatabaseName = @CurrentDatabaseName, @LogToTable = @LogToTable, @Execute = @Execute
4705 SET @Error = @@ERROR
4706 IF @Error <> 0 SET @CurrentCommandOutput01 = @Error
4707 IF @CurrentCommandOutput01 <> 0 SET @ReturnCode = @CurrentCommandOutput01
4708 END
4709
4710 -- Check filegroups
4711 IF EXISTS(SELECT * FROM @SelectedCheckCommands WHERE CheckCommand = 'CHECKFILEGROUP') AND (GETDATE() < DATEADD(ss,@TimeLimit,@StartTime) OR @TimeLimit IS NULL)
4712 BEGIN
4713 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'
4714
4715 INSERT INTO @tmpFileGroups (FileGroupID, FileGroupName, [Order], Selected, Completed)
4716 EXECUTE sp_executesql @statement = @CurrentCommand02
4717 SET @Error = @@ERROR
4718 IF @Error <> 0 SET @ReturnCode = @Error
4719
4720 IF @FileGroups IS NULL
4721 BEGIN
4722 UPDATE tmpFileGroups
4723 SET tmpFileGroups.Selected = 1
4724 FROM @tmpFileGroups tmpFileGroups
4725 END
4726 ELSE
4727 BEGIN
4728 UPDATE tmpFileGroups
4729 SET tmpFileGroups.Selected = SelectedFileGroups.Selected
4730 FROM @tmpFileGroups tmpFileGroups
4731 INNER JOIN @SelectedFileGroups SelectedFileGroups
4732 ON @CurrentDatabaseName LIKE REPLACE(SelectedFileGroups.DatabaseName,'_','[_]') AND tmpFileGroups.FileGroupName LIKE REPLACE(SelectedFileGroups.FileGroupName,'_','[_]')
4733 WHERE SelectedFileGroups.Selected = 1
4734
4735 UPDATE tmpFileGroups
4736 SET tmpFileGroups.Selected = SelectedFileGroups.Selected
4737 FROM @tmpFileGroups tmpFileGroups
4738 INNER JOIN @SelectedFileGroups SelectedFileGroups
4739 ON @CurrentDatabaseName LIKE REPLACE(SelectedFileGroups.DatabaseName,'_','[_]') AND tmpFileGroups.FileGroupName LIKE REPLACE(SelectedFileGroups.FileGroupName,'_','[_]')
4740 WHERE SelectedFileGroups.Selected = 0
4741
4742 UPDATE tmpFileGroups
4743 SET tmpFileGroups.StartPosition = SelectedFileGroups2.StartPosition
4744 FROM @tmpFileGroups tmpFileGroups
4745 INNER JOIN (SELECT tmpFileGroups.FileGroupName, MIN(SelectedFileGroups.StartPosition) AS StartPosition
4746 FROM @tmpFileGroups tmpFileGroups
4747 INNER JOIN @SelectedFileGroups SelectedFileGroups
4748 ON @CurrentDatabaseName LIKE REPLACE(SelectedFileGroups.DatabaseName,'_','[_]') AND tmpFileGroups.FileGroupName LIKE REPLACE(SelectedFileGroups.FileGroupName,'_','[_]')
4749 WHERE SelectedFileGroups.Selected = 1
4750 GROUP BY tmpFileGroups.FileGroupName) SelectedFileGroups2
4751 ON tmpFileGroups.FileGroupName = SelectedFileGroups2.FileGroupName
4752 END;
4753
4754 WITH tmpFileGroups AS (
4755 SELECT FileGroupName, [Order], ROW_NUMBER() OVER (ORDER BY StartPosition ASC, FileGroupName ASC) AS RowNumber
4756 FROM @tmpFileGroups tmpFileGroups
4757 WHERE Selected = 1
4758 )
4759 UPDATE tmpFileGroups
4760 SET [Order] = RowNumber
4761
4762 SET @ErrorMessage = ''
4763 SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + '.' + QUOTENAME(FileGroupName) + ', '
4764 FROM @SelectedFileGroups SelectedFileGroups
4765 WHERE DatabaseName = @CurrentDatabaseName
4766 AND FileGroupName NOT LIKE '%[%]%'
4767 AND NOT EXISTS (SELECT * FROM @tmpFileGroups WHERE FileGroupName = SelectedFileGroups.FileGroupName)
4768 IF @@ROWCOUNT > 0
4769 BEGIN
4770 SET @ErrorMessage = 'The following file groups do not exist: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.' + CHAR(13) + CHAR(10) + ' '
4771 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
4772 SET @Error = @@ERROR
4773 END
4774
4775 WHILE (GETDATE() < DATEADD(ss,@TimeLimit,@StartTime) OR @TimeLimit IS NULL)
4776 BEGIN
4777 SELECT TOP 1 @CurrentFGID = ID,
4778 @CurrentFileGroupID = FileGroupID,
4779 @CurrentFileGroupName = FileGroupName
4780 FROM @tmpFileGroups
4781 WHERE Selected = 1
4782 AND Completed = 0
4783 ORDER BY [Order] ASC
4784
4785 IF @@ROWCOUNT = 0
4786 BEGIN
4787 BREAK
4788 END
4789
4790 -- Does the filegroup exist?
4791 SET @CurrentCommand03 = ''
4792 IF @LockTimeout IS NOT NULL SET @CurrentCommand03 = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; '
4793 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'
4794
4795 BEGIN TRY
4796 EXECUTE sp_executesql @statement = @CurrentCommand03, @params = N'@ParamFileGroupID int, @ParamFileGroupName sysname, @ParamFileGroupExists bit OUTPUT', @ParamFileGroupID = @CurrentFileGroupID, @ParamFileGroupName = @CurrentFileGroupName, @ParamFileGroupExists = @CurrentFileGroupExists OUTPUT
4797
4798 IF @CurrentFileGroupExists IS NULL SET @CurrentFileGroupExists = 0
4799 END TRY
4800 BEGIN CATCH
4801 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 + CHAR(13) + CHAR(10) + ' '
4802 SET @Severity = CASE WHEN ERROR_NUMBER() IN(1205,1222) THEN @LockMessageSeverity ELSE 16 END
4803 RAISERROR(@ErrorMessage,@Severity,1) WITH NOWAIT
4804
4805 IF NOT (ERROR_NUMBER() IN(1205,1222) AND @LockMessageSeverity = 10)
4806 BEGIN
4807 SET @ReturnCode = ERROR_NUMBER()
4808 END
4809 END CATCH
4810
4811 IF @CurrentFileGroupExists = 1
4812 BEGIN
4813 SET @CurrentCommandType04 = 'DBCC_CHECKFILEGROUP'
4814
4815 SET @CurrentCommand04 = ''
4816 IF @LockTimeout IS NOT NULL SET @CurrentCommand04 = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; '
4817 SET @CurrentCommand04 = @CurrentCommand04 + 'USE ' + QUOTENAME(@CurrentDatabaseName) + '; DBCC CHECKFILEGROUP (' + QUOTENAME(@CurrentFileGroupName)
4818 IF @NoIndex = 'Y' SET @CurrentCommand04 = @CurrentCommand04 + ', NOINDEX'
4819 SET @CurrentCommand04 = @CurrentCommand04 + ') WITH NO_INFOMSGS, ALL_ERRORMSGS'
4820 IF @PhysicalOnly = 'Y' SET @CurrentCommand04 = @CurrentCommand04 + ', PHYSICAL_ONLY'
4821 IF @TabLock = 'Y' SET @CurrentCommand04 = @CurrentCommand04 + ', TABLOCK'
4822 IF @MaxDOP IS NOT NULL SET @CurrentCommand04 = @CurrentCommand04 + ', MAXDOP = ' + CAST(@MaxDOP AS nvarchar)
4823
4824 EXECUTE @CurrentCommandOutput04 = [dbo].[CommandExecute] @Command = @CurrentCommand04, @CommandType = @CurrentCommandType04, @Mode = 1, @DatabaseName = @CurrentDatabaseName, @LogToTable = @LogToTable, @Execute = @Execute
4825 SET @Error = @@ERROR
4826 IF @Error <> 0 SET @CurrentCommandOutput04 = @Error
4827 IF @CurrentCommandOutput04 <> 0 SET @ReturnCode = @CurrentCommandOutput04
4828 END
4829
4830 UPDATE @tmpFileGroups
4831 SET Completed = 1
4832 WHERE Selected = 1
4833 AND Completed = 0
4834 AND ID = @CurrentFGID
4835
4836 SET @CurrentFGID = NULL
4837 SET @CurrentFileGroupID = NULL
4838 SET @CurrentFileGroupName = NULL
4839 SET @CurrentFileGroupExists = NULL
4840
4841 SET @CurrentCommand03 = NULL
4842 SET @CurrentCommand04 = NULL
4843
4844 SET @CurrentCommandOutput04 = NULL
4845
4846 SET @CurrentCommandType04 = NULL
4847 END
4848 END
4849
4850 -- Check disk space allocation structures
4851 IF EXISTS(SELECT * FROM @SelectedCheckCommands WHERE CheckCommand = 'CHECKALLOC') AND (GETDATE() < DATEADD(ss,@TimeLimit,@StartTime) OR @TimeLimit IS NULL)
4852 BEGIN
4853 SET @CurrentCommandType05 = 'DBCC_CHECKALLOC'
4854
4855 SET @CurrentCommand05 = ''
4856 IF @LockTimeout IS NOT NULL SET @CurrentCommand05 = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; '
4857 SET @CurrentCommand05 = @CurrentCommand05 + 'DBCC CHECKALLOC (' + QUOTENAME(@CurrentDatabaseName)
4858 SET @CurrentCommand05 = @CurrentCommand05 + ') WITH NO_INFOMSGS, ALL_ERRORMSGS'
4859 IF @TabLock = 'Y' SET @CurrentCommand05 = @CurrentCommand05 + ', TABLOCK'
4860
4861 EXECUTE @CurrentCommandOutput05 = [dbo].[CommandExecute] @Command = @CurrentCommand05, @CommandType = @CurrentCommandType05, @Mode = 1, @DatabaseName = @CurrentDatabaseName, @LogToTable = @LogToTable, @Execute = @Execute
4862 SET @Error = @@ERROR
4863 IF @Error <> 0 SET @CurrentCommandOutput05 = @Error
4864 IF @CurrentCommandOutput05 <> 0 SET @ReturnCode = @CurrentCommandOutput05
4865 END
4866
4867 -- Check objects
4868 IF EXISTS(SELECT * FROM @SelectedCheckCommands WHERE CheckCommand = 'CHECKTABLE') AND (GETDATE() < DATEADD(ss,@TimeLimit,@StartTime) OR @TimeLimit IS NULL)
4869 BEGIN
4870 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'
4871
4872 INSERT INTO @tmpObjects (SchemaID, SchemaName, ObjectID, ObjectName, ObjectType, [Order], Selected, Completed)
4873 EXECUTE sp_executesql @statement = @CurrentCommand06
4874 SET @Error = @@ERROR
4875 IF @Error <> 0 SET @ReturnCode = @Error
4876
4877 IF @Objects IS NULL
4878 BEGIN
4879 UPDATE tmpObjects
4880 SET tmpObjects.Selected = 1
4881 FROM @tmpObjects tmpObjects
4882 END
4883 ELSE
4884 BEGIN
4885 UPDATE tmpObjects
4886 SET tmpObjects.Selected = SelectedObjects.Selected
4887 FROM @tmpObjects tmpObjects
4888 INNER JOIN @SelectedObjects SelectedObjects
4889 ON @CurrentDatabaseName LIKE REPLACE(SelectedObjects.DatabaseName,'_','[_]') AND tmpObjects.SchemaName LIKE REPLACE(SelectedObjects.SchemaName,'_','[_]') AND tmpObjects.ObjectName LIKE REPLACE(SelectedObjects.ObjectName,'_','[_]')
4890 WHERE SelectedObjects.Selected = 1
4891
4892 UPDATE tmpObjects
4893 SET tmpObjects.Selected = SelectedObjects.Selected
4894 FROM @tmpObjects tmpObjects
4895 INNER JOIN @SelectedObjects SelectedObjects
4896 ON @CurrentDatabaseName LIKE REPLACE(SelectedObjects.DatabaseName,'_','[_]') AND tmpObjects.SchemaName LIKE REPLACE(SelectedObjects.SchemaName,'_','[_]') AND tmpObjects.ObjectName LIKE REPLACE(SelectedObjects.ObjectName,'_','[_]')
4897 WHERE SelectedObjects.Selected = 0
4898
4899 UPDATE tmpObjects
4900 SET tmpObjects.StartPosition = SelectedObjects2.StartPosition
4901 FROM @tmpObjects tmpObjects
4902 INNER JOIN (SELECT tmpObjects.SchemaName, tmpObjects.ObjectName, MIN(SelectedObjects.StartPosition) AS StartPosition
4903 FROM @tmpObjects tmpObjects
4904 INNER JOIN @SelectedObjects SelectedObjects
4905 ON @CurrentDatabaseName LIKE REPLACE(SelectedObjects.DatabaseName,'_','[_]') AND tmpObjects.SchemaName LIKE REPLACE(SelectedObjects.SchemaName,'_','[_]') AND tmpObjects.ObjectName LIKE REPLACE(SelectedObjects.ObjectName,'_','[_]')
4906 WHERE SelectedObjects.Selected = 1
4907 GROUP BY tmpObjects.SchemaName, tmpObjects.ObjectName) SelectedObjects2
4908 ON tmpObjects.SchemaName = SelectedObjects2.SchemaName AND tmpObjects.ObjectName = SelectedObjects2.ObjectName
4909 END;
4910
4911 WITH tmpObjects AS (
4912 SELECT SchemaName, ObjectName, [Order], ROW_NUMBER() OVER (ORDER BY StartPosition ASC, SchemaName ASC, ObjectName ASC) AS RowNumber
4913 FROM @tmpObjects tmpObjects
4914 WHERE Selected = 1
4915 )
4916 UPDATE tmpObjects
4917 SET [Order] = RowNumber
4918
4919 SET @ErrorMessage = ''
4920 SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + '.' + QUOTENAME(SchemaName) + '.' + QUOTENAME(ObjectName) + ', '
4921 FROM @SelectedObjects SelectedObjects
4922 WHERE DatabaseName = @CurrentDatabaseName
4923 AND SchemaName NOT LIKE '%[%]%'
4924 AND ObjectName NOT LIKE '%[%]%'
4925 AND NOT EXISTS (SELECT * FROM @tmpObjects WHERE SchemaName = SelectedObjects.SchemaName AND ObjectName = SelectedObjects.ObjectName)
4926 IF @@ROWCOUNT > 0
4927 BEGIN
4928 SET @ErrorMessage = 'The following objects do not exist: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.' + CHAR(13) + CHAR(10) + ' '
4929 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
4930 SET @Error = @@ERROR
4931 END
4932
4933 WHILE (GETDATE() < DATEADD(ss,@TimeLimit,@StartTime) OR @TimeLimit IS NULL)
4934 BEGIN
4935 SELECT TOP 1 @CurrentOID = ID,
4936 @CurrentSchemaID = SchemaID,
4937 @CurrentSchemaName = SchemaName,
4938 @CurrentObjectID = ObjectID,
4939 @CurrentObjectName = ObjectName,
4940 @CurrentObjectType = ObjectType
4941 FROM @tmpObjects
4942 WHERE Selected = 1
4943 AND Completed = 0
4944 ORDER BY [Order] ASC
4945
4946 IF @@ROWCOUNT = 0
4947 BEGIN
4948 BREAK
4949 END
4950
4951 -- Does the object exist?
4952 SET @CurrentCommand07 = ''
4953 IF @LockTimeout IS NOT NULL SET @CurrentCommand07 = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; '
4954 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'
4955
4956 BEGIN TRY
4957 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
4958
4959 IF @CurrentObjectExists IS NULL SET @CurrentObjectExists = 0
4960 END TRY
4961 BEGIN CATCH
4962 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 + CHAR(13) + CHAR(10) + ' '
4963 SET @Severity = CASE WHEN ERROR_NUMBER() IN(1205,1222) THEN @LockMessageSeverity ELSE 16 END
4964 RAISERROR(@ErrorMessage,@Severity,1) WITH NOWAIT
4965
4966 IF NOT (ERROR_NUMBER() IN(1205,1222) AND @LockMessageSeverity = 10)
4967 BEGIN
4968 SET @ReturnCode = ERROR_NUMBER()
4969 END
4970 END CATCH
4971
4972 IF @CurrentObjectExists = 1
4973 BEGIN
4974 SET @CurrentCommandType08 = 'DBCC_CHECKTABLE'
4975
4976 SET @CurrentCommand08 = ''
4977 IF @LockTimeout IS NOT NULL SET @CurrentCommand08 = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; '
4978 SET @CurrentCommand08 = @CurrentCommand08 + 'USE ' + QUOTENAME(@CurrentDatabaseName) + '; DBCC CHECKTABLE (''' + QUOTENAME(@CurrentSchemaName) + '.' + QUOTENAME(@CurrentObjectName) + ''''
4979 IF @NoIndex = 'Y' SET @CurrentCommand08 = @CurrentCommand08 + ', NOINDEX'
4980 SET @CurrentCommand08 = @CurrentCommand08 + ') WITH NO_INFOMSGS, ALL_ERRORMSGS'
4981 IF @PhysicalOnly = 'N' SET @CurrentCommand08 = @CurrentCommand08 + ', DATA_PURITY'
4982 IF @PhysicalOnly = 'Y' SET @CurrentCommand08 = @CurrentCommand08 + ', PHYSICAL_ONLY'
4983 IF @ExtendedLogicalChecks = 'Y' SET @CurrentCommand08 = @CurrentCommand08 + ', EXTENDED_LOGICAL_CHECKS'
4984 IF @TabLock = 'Y' SET @CurrentCommand08 = @CurrentCommand08 + ', TABLOCK'
4985 IF @MaxDOP IS NOT NULL SET @CurrentCommand08 = @CurrentCommand08 + ', MAXDOP = ' + CAST(@MaxDOP AS nvarchar)
4986
4987 EXECUTE @CurrentCommandOutput08 = [dbo].[CommandExecute] @Command = @CurrentCommand08, @CommandType = @CurrentCommandType08, @Mode = 1, @DatabaseName = @CurrentDatabaseName, @SchemaName = @CurrentSchemaName, @ObjectName = @CurrentObjectName, @ObjectType = @CurrentObjectType, @LogToTable = @LogToTable, @Execute = @Execute
4988 SET @Error = @@ERROR
4989 IF @Error <> 0 SET @CurrentCommandOutput08 = @Error
4990 IF @CurrentCommandOutput08 <> 0 SET @ReturnCode = @CurrentCommandOutput08
4991 END
4992
4993 UPDATE @tmpObjects
4994 SET Completed = 1
4995 WHERE Selected = 1
4996 AND Completed = 0
4997 AND ID = @CurrentOID
4998
4999 SET @CurrentOID = NULL
5000 SET @CurrentSchemaID = NULL
5001 SET @CurrentSchemaName = NULL
5002 SET @CurrentObjectID = NULL
5003 SET @CurrentObjectName = NULL
5004 SET @CurrentObjectType = NULL
5005 SET @CurrentObjectExists = NULL
5006
5007 SET @CurrentCommand07 = NULL
5008 SET @CurrentCommand08 = NULL
5009
5010 SET @CurrentCommandOutput08 = NULL
5011
5012 SET @CurrentCommandType08 = NULL
5013 END
5014 END
5015
5016 -- Check catalog
5017 IF EXISTS(SELECT * FROM @SelectedCheckCommands WHERE CheckCommand = 'CHECKCATALOG') AND (GETDATE() < DATEADD(ss,@TimeLimit,@StartTime) OR @TimeLimit IS NULL)
5018 BEGIN
5019 SET @CurrentCommandType09 = 'DBCC_CHECKCATALOG'
5020
5021 SET @CurrentCommand09 = ''
5022 IF @LockTimeout IS NOT NULL SET @CurrentCommand09 = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; '
5023 SET @CurrentCommand09 = @CurrentCommand09 + 'DBCC CHECKCATALOG (' + QUOTENAME(@CurrentDatabaseName)
5024 SET @CurrentCommand09 = @CurrentCommand09 + ') WITH NO_INFOMSGS'
5025
5026 EXECUTE @CurrentCommandOutput09 = [dbo].[CommandExecute] @Command = @CurrentCommand09, @CommandType = @CurrentCommandType09, @Mode = 1, @DatabaseName = @CurrentDatabaseName, @LogToTable = @LogToTable, @Execute = @Execute
5027 SET @Error = @@ERROR
5028 IF @Error <> 0 SET @CurrentCommandOutput09 = @Error
5029 IF @CurrentCommandOutput09 <> 0 SET @ReturnCode = @CurrentCommandOutput09
5030 END
5031
5032 END
5033
5034 IF DATABASEPROPERTYEX(@CurrentDatabaseName,'Status') = 'SUSPECT'
5035 BEGIN
5036 SET @ErrorMessage = 'The database ' + QUOTENAME(@CurrentDatabaseName) + ' is in a SUSPECT state.' + CHAR(13) + CHAR(10) + ' '
5037 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
5038 SET @Error = @@ERROR
5039 END
5040
5041 -- Update that the database is completed
5042 IF @DatabasesInParallel = 'Y'
5043 BEGIN
5044 UPDATE dbo.QueueDatabase
5045 SET DatabaseEndTime = GETDATE()
5046 WHERE QueueID = @QueueID
5047 AND DatabaseName = @CurrentDatabaseName
5048 END
5049 ELSE
5050 BEGIN
5051 UPDATE @tmpDatabases
5052 SET Completed = 1
5053 WHERE Selected = 1
5054 AND Completed = 0
5055 AND ID = @CurrentDBID
5056 END
5057
5058 -- Clear variables
5059 SET @CurrentDBID = NULL
5060 SET @CurrentDatabaseID = NULL
5061 SET @CurrentDatabaseName = NULL
5062 SET @CurrentIsDatabaseAccessible = NULL
5063 SET @CurrentAvailabilityGroup = NULL
5064 SET @CurrentAvailabilityGroupRole = NULL
5065 SET @CurrentAvailabilityGroupBackupPreference = NULL
5066 SET @CurrentIsPreferredBackupReplica = NULL
5067 SET @CurrentDatabaseMirroringRole = NULL
5068 SET @CurrentIsReadOnly = NULL
5069
5070 SET @CurrentCommand01 = NULL
5071 SET @CurrentCommand02 = NULL
5072 SET @CurrentCommand05 = NULL
5073 SET @CurrentCommand06 = NULL
5074 SET @CurrentCommand09 = NULL
5075
5076 SET @CurrentCommandOutput01 = NULL
5077 SET @CurrentCommandOutput05 = NULL
5078 SET @CurrentCommandOutput09 = NULL
5079
5080 SET @CurrentCommandType01 = NULL
5081 SET @CurrentCommandType05 = NULL
5082 SET @CurrentCommandType09 = NULL
5083
5084 DELETE FROM @tmpFileGroups
5085 DELETE FROM @tmpObjects
5086
5087 END
5088
5089 ----------------------------------------------------------------------------------------------------
5090 --// Log completing information //--
5091 ----------------------------------------------------------------------------------------------------
5092
5093 Logging:
5094 SET @EndMessage = 'Date and time: ' + CONVERT(nvarchar,GETDATE(),120)
5095 SET @EndMessage = REPLACE(@EndMessage,'%','%%')
5096 RAISERROR(@EndMessage,10,1) WITH NOWAIT
5097
5098 IF @ReturnCode <> 0
5099 BEGIN
5100 RETURN @ReturnCode
5101 END
5102
5103 ----------------------------------------------------------------------------------------------------
5104
5105END
5106
5107GO
5108SET ANSI_NULLS ON
5109GO
5110SET QUOTED_IDENTIFIER ON
5111GO
5112IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[IndexOptimize]') AND type in (N'P', N'PC'))
5113BEGIN
5114EXEC dbo.sp_executesql @statement = N'CREATE PROCEDURE [dbo].[IndexOptimize] AS'
5115END
5116GO
5117ALTER PROCEDURE [dbo].[IndexOptimize]
5118
5119@Databases nvarchar(max) = NULL,
5120@FragmentationLow nvarchar(max) = NULL,
5121@FragmentationMedium nvarchar(max) = 'INDEX_REORGANIZE,INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
5122@FragmentationHigh nvarchar(max) = 'INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
5123@FragmentationLevel1 int = 5,
5124@FragmentationLevel2 int = 30,
5125@MinNumberOfPages int = 1000,
5126@MaxNumberOfPages int = NULL,
5127@SortInTempdb nvarchar(max) = 'N',
5128@MaxDOP int = NULL,
5129@FillFactor int = NULL,
5130@PadIndex nvarchar(max) = NULL,
5131@LOBCompaction nvarchar(max) = 'Y',
5132@UpdateStatistics nvarchar(max) = NULL,
5133@OnlyModifiedStatistics nvarchar(max) = 'N',
5134@StatisticsModificationLevel int = NULL,
5135@StatisticsSample int = NULL,
5136@StatisticsResample nvarchar(max) = 'N',
5137@PartitionLevel nvarchar(max) = 'Y',
5138@MSShippedObjects nvarchar(max) = 'N',
5139@Indexes nvarchar(max) = NULL,
5140@TimeLimit int = NULL,
5141@Delay int = NULL,
5142@WaitAtLowPriorityMaxDuration int = NULL,
5143@WaitAtLowPriorityAbortAfterWait nvarchar(max) = NULL,
5144@Resumable nvarchar(max) = 'N',
5145@AvailabilityGroups nvarchar(max) = NULL,
5146@LockTimeout int = NULL,
5147@LockMessageSeverity int = 16,
5148@DatabaseOrder nvarchar(max) = NULL,
5149@DatabasesInParallel nvarchar(max) = 'N',
5150@LogToTable nvarchar(max) = 'N',
5151@Execute nvarchar(max) = 'Y'
5152
5153AS
5154
5155BEGIN
5156
5157
5158 SET NOCOUNT ON
5159
5160 SET ARITHABORT ON
5161
5162 SET NUMERIC_ROUNDABORT OFF
5163
5164 DECLARE @StartMessage nvarchar(max)
5165 DECLARE @EndMessage nvarchar(max)
5166 DECLARE @DatabaseMessage nvarchar(max)
5167 DECLARE @ErrorMessage nvarchar(max)
5168 DECLARE @Severity int
5169
5170 DECLARE @StartTime datetime
5171 DECLARE @SchemaName nvarchar(max)
5172 DECLARE @ObjectName nvarchar(max)
5173 DECLARE @VersionTimestamp nvarchar(max)
5174 DECLARE @Parameters nvarchar(max)
5175
5176 DECLARE @Version numeric(18,10)
5177 DECLARE @HostPlatform nvarchar(max)
5178 DECLARE @AmazonRDS bit
5179
5180 DECLARE @PartitionLevelStatistics bit
5181
5182 DECLARE @QueueID int
5183 DECLARE @QueueStartTime datetime
5184
5185 DECLARE @CurrentDBID int
5186 DECLARE @CurrentDatabaseID int
5187 DECLARE @CurrentDatabaseName nvarchar(max)
5188 DECLARE @CurrentIsDatabaseAccessible bit
5189 DECLARE @CurrentAvailabilityGroup nvarchar(max)
5190 DECLARE @CurrentAvailabilityGroupRole nvarchar(max)
5191 DECLARE @CurrentDatabaseMirroringRole nvarchar(max)
5192 DECLARE @CurrentIsReadOnly bit
5193
5194 DECLARE @CurrentCommand01 nvarchar(max)
5195 DECLARE @CurrentCommand02 nvarchar(max)
5196 DECLARE @CurrentCommand03 nvarchar(max)
5197 DECLARE @CurrentCommand04 nvarchar(max)
5198 DECLARE @CurrentCommand05 nvarchar(max)
5199 DECLARE @CurrentCommand06 nvarchar(max)
5200 DECLARE @CurrentCommand07 nvarchar(max)
5201
5202 DECLARE @CurrentCommandOutput06 int
5203 DECLARE @CurrentCommandOutput07 int
5204
5205 DECLARE @CurrentCommandType06 nvarchar(max)
5206 DECLARE @CurrentCommandType07 nvarchar(max)
5207
5208 DECLARE @CurrentComment06 nvarchar(max)
5209 DECLARE @CurrentComment07 nvarchar(max)
5210
5211 DECLARE @CurrentExtendedInfo06 xml
5212 DECLARE @CurrentExtendedInfo07 xml
5213
5214 DECLARE @CurrentIxID int
5215 DECLARE @CurrentSchemaID int
5216 DECLARE @CurrentSchemaName nvarchar(max)
5217 DECLARE @CurrentObjectID int
5218 DECLARE @CurrentObjectName nvarchar(max)
5219 DECLARE @CurrentObjectType nvarchar(max)
5220 DECLARE @CurrentIsMemoryOptimized bit
5221 DECLARE @CurrentIndexID int
5222 DECLARE @CurrentIndexName nvarchar(max)
5223 DECLARE @CurrentIndexType int
5224 DECLARE @CurrentStatisticsID int
5225 DECLARE @CurrentStatisticsName nvarchar(max)
5226 DECLARE @CurrentPartitionID bigint
5227 DECLARE @CurrentPartitionNumber int
5228 DECLARE @CurrentPartitionCount int
5229 DECLARE @CurrentIsPartition bit
5230 DECLARE @CurrentIndexExists bit
5231 DECLARE @CurrentStatisticsExists bit
5232 DECLARE @CurrentIsImageText bit
5233 DECLARE @CurrentIsNewLOB bit
5234 DECLARE @CurrentIsFileStream bit
5235 DECLARE @CurrentIsColumnStore bit
5236 DECLARE @CurrentIsComputed bit
5237 DECLARE @CurrentIsTimestamp bit
5238 DECLARE @CurrentAllowPageLocks bit
5239 DECLARE @CurrentNoRecompute bit
5240 DECLARE @CurrentIsIncremental bit
5241 DECLARE @CurrentRowCount bigint
5242 DECLARE @CurrentModificationCounter bigint
5243 DECLARE @CurrentOnReadOnlyFileGroup bit
5244 DECLARE @CurrentResumableIndexOperation bit
5245 DECLARE @CurrentFragmentationLevel float
5246 DECLARE @CurrentPageCount bigint
5247 DECLARE @CurrentFragmentationGroup nvarchar(max)
5248 DECLARE @CurrentAction nvarchar(max)
5249 DECLARE @CurrentMaxDOP int
5250 DECLARE @CurrentUpdateStatistics nvarchar(max)
5251 DECLARE @CurrentStatisticsSample int
5252 DECLARE @CurrentStatisticsResample nvarchar(max)
5253 DECLARE @CurrentDelay datetime
5254
5255 DECLARE @tmpDatabases TABLE (ID int IDENTITY,
5256 DatabaseName nvarchar(max),
5257 DatabaseType nvarchar(max),
5258 AvailabilityGroup bit,
5259 StartPosition int,
5260 DatabaseSize bigint,
5261 [Order] int,
5262 Selected bit,
5263 Completed bit,
5264 PRIMARY KEY(Selected, Completed, [Order], ID))
5265
5266 DECLARE @tmpAvailabilityGroups TABLE (ID int IDENTITY PRIMARY KEY,
5267 AvailabilityGroupName nvarchar(max),
5268 StartPosition int,
5269 Selected bit)
5270
5271 DECLARE @tmpDatabasesAvailabilityGroups TABLE (DatabaseName nvarchar(max),
5272 AvailabilityGroupName nvarchar(max))
5273
5274 DECLARE @tmpIndexesStatistics TABLE (ID int IDENTITY,
5275 SchemaID int,
5276 SchemaName nvarchar(max),
5277 ObjectID int,
5278 ObjectName nvarchar(max),
5279 ObjectType nvarchar(max),
5280 IsMemoryOptimized bit,
5281 IndexID int,
5282 IndexName nvarchar(max),
5283 IndexType int,
5284 AllowPageLocks bit,
5285 IsImageText bit,
5286 IsNewLOB bit,
5287 IsFileStream bit,
5288 IsColumnStore bit,
5289 IsComputed bit,
5290 IsTimestamp bit,
5291 OnReadOnlyFileGroup bit,
5292 ResumableIndexOperation bit,
5293 StatisticsID int,
5294 StatisticsName nvarchar(max),
5295 [NoRecompute] bit,
5296 IsIncremental bit,
5297 PartitionID bigint,
5298 PartitionNumber int,
5299 PartitionCount int,
5300 StartPosition int,
5301 [Order] int,
5302 Selected bit,
5303 Completed bit,
5304 PRIMARY KEY(Selected, Completed, [Order], ID))
5305
5306 DECLARE @SelectedDatabases TABLE (DatabaseName nvarchar(max),
5307 DatabaseType nvarchar(max),
5308 AvailabilityGroup nvarchar(max),
5309 StartPosition int,
5310 Selected bit)
5311
5312 DECLARE @SelectedAvailabilityGroups TABLE (AvailabilityGroupName nvarchar(max),
5313 StartPosition int,
5314 Selected bit)
5315
5316 DECLARE @SelectedIndexes TABLE (DatabaseName nvarchar(max),
5317 SchemaName nvarchar(max),
5318 ObjectName nvarchar(max),
5319 IndexName nvarchar(max),
5320 StartPosition int,
5321 Selected bit)
5322
5323 DECLARE @Actions TABLE ([Action] nvarchar(max))
5324
5325 INSERT INTO @Actions([Action]) VALUES('INDEX_REBUILD_ONLINE')
5326 INSERT INTO @Actions([Action]) VALUES('INDEX_REBUILD_OFFLINE')
5327 INSERT INTO @Actions([Action]) VALUES('INDEX_REORGANIZE')
5328
5329 DECLARE @ActionsPreferred TABLE (FragmentationGroup nvarchar(max),
5330 [Priority] int,
5331 [Action] nvarchar(max))
5332
5333 DECLARE @CurrentActionsAllowed TABLE ([Action] nvarchar(max))
5334
5335
5336 DECLARE @CurrentAlterIndexWithClauseArguments TABLE (ID int IDENTITY,
5337 Argument nvarchar(max))
5338
5339 DECLARE @CurrentAlterIndexWithClause nvarchar(max)
5340
5341 DECLARE @CurrentUpdateStatisticsWithClauseArguments TABLE (ID int IDENTITY,
5342 Argument nvarchar(max))
5343
5344 DECLARE @CurrentUpdateStatisticsWithClause nvarchar(max)
5345
5346 DECLARE @Error int
5347 DECLARE @ReturnCode int
5348
5349 SET @Error = 0
5350 SET @ReturnCode = 0
5351
5352 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))
5353
5354 IF @Version >= 14
5355 BEGIN
5356 SELECT @HostPlatform = host_platform
5357 FROM sys.dm_os_host_info
5358 END
5359 ELSE
5360 BEGIN
5361 SET @HostPlatform = 'Windows'
5362 END
5363
5364 SET @AmazonRDS = CASE WHEN DB_ID('rdsadmin') IS NOT NULL AND SUSER_SNAME(0x01) = 'rdsa' THEN 1 ELSE 0 END
5365
5366 ----------------------------------------------------------------------------------------------------
5367 --// Log initial information //--
5368 ----------------------------------------------------------------------------------------------------
5369
5370 SET @StartTime = GETDATE()
5371 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)
5372 SET @ObjectName = OBJECT_NAME(@@PROCID)
5373 SET @VersionTimestamp = SUBSTRING(OBJECT_DEFINITION(@@PROCID),CHARINDEX('--// Version: ',OBJECT_DEFINITION(@@PROCID)) + LEN('--// Version: ') + 1, 19)
5374
5375 SET @Parameters = '@Databases = ' + ISNULL('''' + REPLACE(@Databases,'''','''''') + '''','NULL')
5376 SET @Parameters = @Parameters + ', @FragmentationLow = ' + ISNULL('''' + REPLACE(@FragmentationLow,'''','''''') + '''','NULL')
5377 SET @Parameters = @Parameters + ', @FragmentationMedium = ' + ISNULL('''' + REPLACE(@FragmentationMedium,'''','''''') + '''','NULL')
5378 SET @Parameters = @Parameters + ', @FragmentationHigh = ' + ISNULL('''' + REPLACE(@FragmentationHigh,'''','''''') + '''','NULL')
5379 SET @Parameters = @Parameters + ', @FragmentationLevel1 = ' + ISNULL(CAST(@FragmentationLevel1 AS nvarchar),'NULL')
5380 SET @Parameters = @Parameters + ', @FragmentationLevel2 = ' + ISNULL(CAST(@FragmentationLevel2 AS nvarchar),'NULL')
5381 SET @Parameters = @Parameters + ', @MinNumberOfPages = ' + ISNULL(CAST(@MinNumberOfPages AS nvarchar),'NULL')
5382 SET @Parameters = @Parameters + ', @MaxNumberOfPages = ' + ISNULL(CAST(@MaxNumberOfPages AS nvarchar),'NULL')
5383 SET @Parameters = @Parameters + ', @SortInTempdb = ' + ISNULL('''' + REPLACE(@SortInTempdb,'''','''''') + '''','NULL')
5384 SET @Parameters = @Parameters + ', @MaxDOP = ' + ISNULL(CAST(@MaxDOP AS nvarchar),'NULL')
5385 SET @Parameters = @Parameters + ', @FillFactor = ' + ISNULL(CAST(@FillFactor AS nvarchar),'NULL')
5386 SET @Parameters = @Parameters + ', @PadIndex = ' + ISNULL('''' + REPLACE(@PadIndex,'''','''''') + '''','NULL')
5387 SET @Parameters = @Parameters + ', @LOBCompaction = ' + ISNULL('''' + REPLACE(@LOBCompaction,'''','''''') + '''','NULL')
5388 SET @Parameters = @Parameters + ', @UpdateStatistics = ' + ISNULL('''' + REPLACE(@UpdateStatistics,'''','''''') + '''','NULL')
5389 SET @Parameters = @Parameters + ', @OnlyModifiedStatistics = ' + ISNULL('''' + REPLACE(@OnlyModifiedStatistics,'''','''''') + '''','NULL')
5390 SET @Parameters = @Parameters + ', @StatisticsModificationLevel = ' + ISNULL(CAST(@StatisticsModificationLevel AS nvarchar),'NULL')
5391 SET @Parameters = @Parameters + ', @StatisticsSample = ' + ISNULL(CAST(@StatisticsSample AS nvarchar),'NULL')
5392 SET @Parameters = @Parameters + ', @StatisticsResample = ' + ISNULL('''' + REPLACE(@StatisticsResample,'''','''''') + '''','NULL')
5393 SET @Parameters = @Parameters + ', @PartitionLevel = ' + ISNULL('''' + REPLACE(@PartitionLevel,'''','''''') + '''','NULL')
5394 SET @Parameters = @Parameters + ', @MSShippedObjects = ' + ISNULL('''' + REPLACE(@MSShippedObjects,'''','''''') + '''','NULL')
5395 SET @Parameters = @Parameters + ', @Indexes = ' + ISNULL('''' + REPLACE(@Indexes,'''','''''') + '''','NULL')
5396 SET @Parameters = @Parameters + ', @TimeLimit = ' + ISNULL(CAST(@TimeLimit AS nvarchar),'NULL')
5397 SET @Parameters = @Parameters + ', @Delay = ' + ISNULL(CAST(@Delay AS nvarchar),'NULL')
5398 SET @Parameters = @Parameters + ', @WaitAtLowPriorityMaxDuration = ' + ISNULL(CAST(@WaitAtLowPriorityMaxDuration AS nvarchar),'NULL')
5399 SET @Parameters = @Parameters + ', @WaitAtLowPriorityAbortAfterWait = ' + ISNULL('''' + REPLACE(@WaitAtLowPriorityAbortAfterWait,'''','''''') + '''','NULL')
5400 SET @Parameters = @Parameters + ', @Resumable = ' + ISNULL('''' + REPLACE(@Resumable,'''','''''') + '''','NULL')
5401 SET @Parameters = @Parameters + ', @AvailabilityGroups = ' + ISNULL('''' + REPLACE(@AvailabilityGroups,'''','''''') + '''','NULL')
5402 SET @Parameters = @Parameters + ', @LockTimeout = ' + ISNULL(CAST(@LockTimeout AS nvarchar),'NULL')
5403 SET @Parameters = @Parameters + ', @LockMessageSeverity = ' + ISNULL(CAST(@LockMessageSeverity AS nvarchar),'NULL')
5404 SET @Parameters = @Parameters + ', @DatabaseOrder = ' + ISNULL('''' + REPLACE(@DatabaseOrder,'''','''''') + '''','NULL')
5405 SET @Parameters = @Parameters + ', @DatabasesInParallel = ' + ISNULL('''' + REPLACE(@DatabasesInParallel,'''','''''') + '''','NULL')
5406 SET @Parameters = @Parameters + ', @LogToTable = ' + ISNULL('''' + REPLACE(@LogToTable,'''','''''') + '''','NULL')
5407 SET @Parameters = @Parameters + ', @Execute = ' + ISNULL('''' + REPLACE(@Execute,'''','''''') + '''','NULL')
5408
5409 SET @StartMessage = 'Date and time: ' + CONVERT(nvarchar,@StartTime,120)
5410 RAISERROR(@StartMessage,10,1) WITH NOWAIT
5411
5412 SET @StartMessage = 'Server: ' + CAST(SERVERPROPERTY('ServerName') AS nvarchar(max))
5413 RAISERROR(@StartMessage,10,1) WITH NOWAIT
5414
5415 SET @StartMessage = 'Version: ' + CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(max))
5416 RAISERROR(@StartMessage,10,1) WITH NOWAIT
5417
5418 SET @StartMessage = 'Edition: ' + CAST(SERVERPROPERTY('Edition') AS nvarchar(max))
5419 RAISERROR(@StartMessage,10,1) WITH NOWAIT
5420
5421 SET @StartMessage = 'Platform: ' + @HostPlatform
5422 RAISERROR(@StartMessage,10,1) WITH NOWAIT
5423
5424 SET @StartMessage = 'Procedure: ' + QUOTENAME(DB_NAME(DB_ID())) + '.' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(@ObjectName)
5425 RAISERROR(@StartMessage,10,1) WITH NOWAIT
5426
5427 SET @StartMessage = 'Parameters: ' + @Parameters
5428 SET @StartMessage = REPLACE(@StartMessage,'%','%%')
5429 RAISERROR(@StartMessage,10,1) WITH NOWAIT
5430
5431 SET @StartMessage = 'Version: ' + @VersionTimestamp
5432 RAISERROR(@StartMessage,10,1) WITH NOWAIT
5433
5434 SET @StartMessage = 'Source: https://FixSQL.co.uk' + CHAR(13) + CHAR(10) + ' '
5435 RAISERROR(@StartMessage,10,1) WITH NOWAIT
5436
5437 ----------------------------------------------------------------------------------------------------
5438 --// Check core requirements //--
5439 ----------------------------------------------------------------------------------------------------
5440
5441 IF NOT (SELECT [compatibility_level] FROM sys.databases WHERE database_id = DB_ID()) >= 90
5442 BEGIN
5443 SET @ErrorMessage = 'The database ' + QUOTENAME(DB_NAME(DB_ID())) + ' has to be in compatibility level 90 or higher.' + CHAR(13) + CHAR(10) + ' '
5444 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
5445 SET @Error = @@ERROR
5446 END
5447
5448 IF NOT (SELECT uses_ansi_nulls FROM sys.sql_modules WHERE [object_id] = @@PROCID) = 1
5449 BEGIN
5450 SET @ErrorMessage = 'ANSI_NULLS has to be set to ON for the stored procedure.' + CHAR(13) + CHAR(10) + ' '
5451 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
5452 SET @Error = @@ERROR
5453 END
5454
5455 IF NOT (SELECT uses_quoted_identifier FROM sys.sql_modules WHERE [object_id] = @@PROCID) = 1
5456 BEGIN
5457 SET @ErrorMessage = 'QUOTED_IDENTIFIER has to be set to ON for the stored procedure.' + CHAR(13) + CHAR(10) + ' '
5458 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
5459 SET @Error = @@ERROR
5460 END
5461
5462 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')
5463 BEGIN
5464 SET @ErrorMessage = 'The stored procedure CommandExecute is missing. Download https://FixSQL.co.uk/scripts/CommandExecute.sql.' + CHAR(13) + CHAR(10) + ' '
5465 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
5466 SET @Error = @@ERROR
5467 END
5468
5469 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%')
5470 BEGIN
5471 SET @ErrorMessage = 'The stored procedure CommandExecute needs to be updated. Download https://FixSQL.co.uk/scripts/CommandExecute.sql.' + CHAR(13) + CHAR(10) + ' '
5472 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
5473 SET @Error = @@ERROR
5474 END
5475
5476 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')
5477 BEGIN
5478 SET @ErrorMessage = 'The table CommandLog is missing. Download https://FixSQL.co.uk/scripts/CommandLog.sql.' + CHAR(13) + CHAR(10) + ' '
5479 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
5480 SET @Error = @@ERROR
5481 END
5482
5483 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')
5484 BEGIN
5485 SET @ErrorMessage = 'The table Queue is missing. Download https://FixSQL.co.uk/scripts/Queue.sql.' + CHAR(13) + CHAR(10) + ' '
5486 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
5487 SET @Error = @@ERROR
5488 END
5489
5490 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')
5491 BEGIN
5492 SET @ErrorMessage = 'The table QueueDatabase is missing. Download https://FixSQL.co.uk/scripts/QueueDatabase.sql.' + CHAR(13) + CHAR(10) + ' '
5493 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
5494 SET @Error = @@ERROR
5495 END
5496
5497 IF @@TRANCOUNT <> 0
5498 BEGIN
5499 SET @ErrorMessage = 'The transaction count is not 0.' + CHAR(13) + CHAR(10) + ' '
5500 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
5501 SET @Error = @@ERROR
5502 END
5503
5504 IF @Error <> 0
5505 BEGIN
5506 SET @ReturnCode = @Error
5507 GOTO Logging
5508 END
5509
5510 ----------------------------------------------------------------------------------------------------
5511 --// Select databases //--
5512 ----------------------------------------------------------------------------------------------------
5513
5514 SET @Databases = REPLACE(@Databases, CHAR(10), '')
5515 SET @Databases = REPLACE(@Databases, CHAR(13), '')
5516
5517 WHILE CHARINDEX(', ',@Databases) > 0 SET @Databases = REPLACE(@Databases,', ',',')
5518 WHILE CHARINDEX(' ,',@Databases) > 0 SET @Databases = REPLACE(@Databases,' ,',',')
5519
5520 SET @Databases = LTRIM(RTRIM(@Databases));
5521
5522 WITH Databases1 (StartPosition, EndPosition, DatabaseItem) AS
5523 (
5524 SELECT 1 AS StartPosition,
5525 ISNULL(NULLIF(CHARINDEX(',', @Databases, 1), 0), LEN(@Databases) + 1) AS EndPosition,
5526 SUBSTRING(@Databases, 1, ISNULL(NULLIF(CHARINDEX(',', @Databases, 1), 0), LEN(@Databases) + 1) - 1) AS DatabaseItem
5527 WHERE @Databases IS NOT NULL
5528 UNION ALL
5529 SELECT CAST(EndPosition AS int) + 1 AS StartPosition,
5530 ISNULL(NULLIF(CHARINDEX(',', @Databases, EndPosition + 1), 0), LEN(@Databases) + 1) AS EndPosition,
5531 SUBSTRING(@Databases, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(',', @Databases, EndPosition + 1), 0), LEN(@Databases) + 1) - EndPosition - 1) AS DatabaseItem
5532 FROM Databases1
5533 WHERE EndPosition < LEN(@Databases) + 1
5534 ),
5535 Databases2 (DatabaseItem, StartPosition, Selected) AS
5536 (
5537 SELECT CASE WHEN DatabaseItem LIKE '-%' THEN RIGHT(DatabaseItem,LEN(DatabaseItem) - 1) ELSE DatabaseItem END AS DatabaseItem,
5538 StartPosition,
5539 CASE WHEN DatabaseItem LIKE '-%' THEN 0 ELSE 1 END AS Selected
5540 FROM Databases1
5541 ),
5542 Databases3 (DatabaseItem, DatabaseType, AvailabilityGroup, StartPosition, Selected) AS
5543 (
5544 SELECT CASE WHEN DatabaseItem IN('ALL_DATABASES','SYSTEM_DATABASES','USER_DATABASES','AVAILABILITY_GROUP_DATABASES') THEN '%' ELSE DatabaseItem END AS DatabaseItem,
5545 CASE WHEN DatabaseItem = 'SYSTEM_DATABASES' THEN 'S' WHEN DatabaseItem = 'USER_DATABASES' THEN 'U' ELSE NULL END AS DatabaseType,
5546 CASE WHEN DatabaseItem = 'AVAILABILITY_GROUP_DATABASES' THEN 1 ELSE NULL END AvailabilityGroup,
5547 StartPosition,
5548 Selected
5549 FROM Databases2
5550 ),
5551 Databases4 (DatabaseName, DatabaseType, AvailabilityGroup, StartPosition, Selected) AS
5552 (
5553 SELECT CASE WHEN LEFT(DatabaseItem,1) = '[' AND RIGHT(DatabaseItem,1) = ']' THEN PARSENAME(DatabaseItem,1) ELSE DatabaseItem END AS DatabaseItem,
5554 DatabaseType,
5555 AvailabilityGroup,
5556 StartPosition,
5557 Selected
5558 FROM Databases3
5559 )
5560 INSERT INTO @SelectedDatabases (DatabaseName, DatabaseType, AvailabilityGroup, StartPosition, Selected)
5561 SELECT DatabaseName,
5562 DatabaseType,
5563 AvailabilityGroup,
5564 StartPosition,
5565 Selected
5566 FROM Databases4
5567 OPTION (MAXRECURSION 0)
5568
5569 IF @Version >= 11 AND SERVERPROPERTY('IsHadrEnabled') = 1
5570 BEGIN
5571 INSERT INTO @tmpAvailabilityGroups (AvailabilityGroupName, Selected)
5572 SELECT name AS AvailabilityGroupName,
5573 0 AS Selected
5574 FROM sys.availability_groups
5575
5576 INSERT INTO @tmpDatabasesAvailabilityGroups (DatabaseName, AvailabilityGroupName)
5577 SELECT availability_databases_cluster.database_name, availability_groups.name
5578 FROM sys.availability_databases_cluster availability_databases_cluster
5579 INNER JOIN sys.availability_groups availability_groups ON availability_databases_cluster.group_id = availability_groups.group_id
5580 END
5581
5582 INSERT INTO @tmpDatabases (DatabaseName, DatabaseType, AvailabilityGroup, [Order], Selected, Completed)
5583 SELECT [name] AS DatabaseName,
5584 CASE WHEN name IN('master','msdb','model') THEN 'S' ELSE 'U' END AS DatabaseType,
5585 NULL AS AvailabilityGroup,
5586 0 AS [Order],
5587 0 AS Selected,
5588 0 AS Completed
5589 FROM sys.databases
5590 WHERE [name] <> 'tempdb'
5591 AND source_database_id IS NULL
5592 ORDER BY [name] ASC
5593
5594 UPDATE tmpDatabases
5595 SET AvailabilityGroup = CASE WHEN EXISTS (SELECT * FROM @tmpDatabasesAvailabilityGroups WHERE DatabaseName = tmpDatabases.DatabaseName) THEN 1 ELSE 0 END
5596 FROM @tmpDatabases tmpDatabases
5597
5598 UPDATE tmpDatabases
5599 SET tmpDatabases.Selected = SelectedDatabases.Selected
5600 FROM @tmpDatabases tmpDatabases
5601 INNER JOIN @SelectedDatabases SelectedDatabases
5602 ON tmpDatabases.DatabaseName LIKE REPLACE(SelectedDatabases.DatabaseName,'_','[_]')
5603 AND (tmpDatabases.DatabaseType = SelectedDatabases.DatabaseType OR SelectedDatabases.DatabaseType IS NULL)
5604 AND (tmpDatabases.AvailabilityGroup = SelectedDatabases.AvailabilityGroup OR SelectedDatabases.AvailabilityGroup IS NULL)
5605 WHERE SelectedDatabases.Selected = 1
5606
5607 UPDATE tmpDatabases
5608 SET tmpDatabases.Selected = SelectedDatabases.Selected
5609 FROM @tmpDatabases tmpDatabases
5610 INNER JOIN @SelectedDatabases SelectedDatabases
5611 ON tmpDatabases.DatabaseName LIKE REPLACE(SelectedDatabases.DatabaseName,'_','[_]')
5612 AND (tmpDatabases.DatabaseType = SelectedDatabases.DatabaseType OR SelectedDatabases.DatabaseType IS NULL)
5613 AND (tmpDatabases.AvailabilityGroup = SelectedDatabases.AvailabilityGroup OR SelectedDatabases.AvailabilityGroup IS NULL)
5614 WHERE SelectedDatabases.Selected = 0
5615
5616 UPDATE tmpDatabases
5617 SET tmpDatabases.StartPosition = SelectedDatabases2.StartPosition
5618 FROM @tmpDatabases tmpDatabases
5619 INNER JOIN (SELECT tmpDatabases.DatabaseName, MIN(SelectedDatabases.StartPosition) AS StartPosition
5620 FROM @tmpDatabases tmpDatabases
5621 INNER JOIN @SelectedDatabases SelectedDatabases
5622 ON tmpDatabases.DatabaseName LIKE REPLACE(SelectedDatabases.DatabaseName,'_','[_]')
5623 AND (tmpDatabases.DatabaseType = SelectedDatabases.DatabaseType OR SelectedDatabases.DatabaseType IS NULL)
5624 AND (tmpDatabases.AvailabilityGroup = SelectedDatabases.AvailabilityGroup OR SelectedDatabases.AvailabilityGroup IS NULL)
5625 WHERE SelectedDatabases.Selected = 1
5626 GROUP BY tmpDatabases.DatabaseName) SelectedDatabases2
5627 ON tmpDatabases.DatabaseName = SelectedDatabases2.DatabaseName
5628
5629 IF @Databases IS NOT NULL AND (NOT EXISTS(SELECT * FROM @SelectedDatabases) OR EXISTS(SELECT * FROM @SelectedDatabases WHERE DatabaseName IS NULL OR DatabaseName = ''))
5630 BEGIN
5631 SET @ErrorMessage = 'The value for the parameter @Databases is not supported.' + CHAR(13) + CHAR(10) + ' '
5632 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
5633 SET @Error = @@ERROR
5634 END
5635
5636 ----------------------------------------------------------------------------------------------------
5637 --// Select availability groups //--
5638 ----------------------------------------------------------------------------------------------------
5639
5640 IF @AvailabilityGroups IS NOT NULL AND @Version >= 11 AND SERVERPROPERTY('IsHadrEnabled') = 1
5641 BEGIN
5642
5643 SET @AvailabilityGroups = REPLACE(@AvailabilityGroups, CHAR(10), '')
5644 SET @AvailabilityGroups = REPLACE(@AvailabilityGroups, CHAR(13), '')
5645
5646 WHILE CHARINDEX(', ',@AvailabilityGroups) > 0 SET @AvailabilityGroups = REPLACE(@AvailabilityGroups,', ',',')
5647 WHILE CHARINDEX(' ,',@AvailabilityGroups) > 0 SET @AvailabilityGroups = REPLACE(@AvailabilityGroups,' ,',',')
5648
5649 SET @AvailabilityGroups = LTRIM(RTRIM(@AvailabilityGroups));
5650
5651 WITH AvailabilityGroups1 (StartPosition, EndPosition, AvailabilityGroupItem) AS
5652 (
5653 SELECT 1 AS StartPosition,
5654 ISNULL(NULLIF(CHARINDEX(',', @AvailabilityGroups, 1), 0), LEN(@AvailabilityGroups) + 1) AS EndPosition,
5655 SUBSTRING(@AvailabilityGroups, 1, ISNULL(NULLIF(CHARINDEX(',', @AvailabilityGroups, 1), 0), LEN(@AvailabilityGroups) + 1) - 1) AS AvailabilityGroupItem
5656 WHERE @AvailabilityGroups IS NOT NULL
5657 UNION ALL
5658 SELECT CAST(EndPosition AS int) + 1 AS StartPosition,
5659 ISNULL(NULLIF(CHARINDEX(',', @AvailabilityGroups, EndPosition + 1), 0), LEN(@AvailabilityGroups) + 1) AS EndPosition,
5660 SUBSTRING(@AvailabilityGroups, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(',', @AvailabilityGroups, EndPosition + 1), 0), LEN(@AvailabilityGroups) + 1) - EndPosition - 1) AS AvailabilityGroupItem
5661 FROM AvailabilityGroups1
5662 WHERE EndPosition < LEN(@AvailabilityGroups) + 1
5663 ),
5664 AvailabilityGroups2 (AvailabilityGroupItem, StartPosition, Selected) AS
5665 (
5666 SELECT CASE WHEN AvailabilityGroupItem LIKE '-%' THEN RIGHT(AvailabilityGroupItem,LEN(AvailabilityGroupItem) - 1) ELSE AvailabilityGroupItem END AS AvailabilityGroupItem,
5667 StartPosition,
5668 CASE WHEN AvailabilityGroupItem LIKE '-%' THEN 0 ELSE 1 END AS Selected
5669 FROM AvailabilityGroups1
5670 ),
5671 AvailabilityGroups3 (AvailabilityGroupItem, StartPosition, Selected) AS
5672 (
5673 SELECT CASE WHEN AvailabilityGroupItem = 'ALL_AVAILABILITY_GROUPS' THEN '%' ELSE AvailabilityGroupItem END AS AvailabilityGroupItem,
5674 StartPosition,
5675 Selected
5676 FROM AvailabilityGroups2
5677 ),
5678 AvailabilityGroups4 (AvailabilityGroupName, StartPosition, Selected) AS
5679 (
5680 SELECT CASE WHEN LEFT(AvailabilityGroupItem,1) = '[' AND RIGHT(AvailabilityGroupItem,1) = ']' THEN PARSENAME(AvailabilityGroupItem,1) ELSE AvailabilityGroupItem END AS AvailabilityGroupItem,
5681 StartPosition,
5682 Selected
5683 FROM AvailabilityGroups3
5684 )
5685 INSERT INTO @SelectedAvailabilityGroups (AvailabilityGroupName, StartPosition, Selected)
5686 SELECT AvailabilityGroupName, StartPosition, Selected
5687 FROM AvailabilityGroups4
5688 OPTION (MAXRECURSION 0)
5689
5690 UPDATE tmpAvailabilityGroups
5691 SET tmpAvailabilityGroups.Selected = SelectedAvailabilityGroups.Selected
5692 FROM @tmpAvailabilityGroups tmpAvailabilityGroups
5693 INNER JOIN @SelectedAvailabilityGroups SelectedAvailabilityGroups
5694 ON tmpAvailabilityGroups.AvailabilityGroupName LIKE REPLACE(SelectedAvailabilityGroups.AvailabilityGroupName,'_','[_]')
5695 WHERE SelectedAvailabilityGroups.Selected = 1
5696
5697 UPDATE tmpAvailabilityGroups
5698 SET tmpAvailabilityGroups.Selected = SelectedAvailabilityGroups.Selected
5699 FROM @tmpAvailabilityGroups tmpAvailabilityGroups
5700 INNER JOIN @SelectedAvailabilityGroups SelectedAvailabilityGroups
5701 ON tmpAvailabilityGroups.AvailabilityGroupName LIKE REPLACE(SelectedAvailabilityGroups.AvailabilityGroupName,'_','[_]')
5702 WHERE SelectedAvailabilityGroups.Selected = 0
5703
5704 UPDATE tmpAvailabilityGroups
5705 SET tmpAvailabilityGroups.StartPosition = SelectedAvailabilityGroups2.StartPosition
5706 FROM @tmpAvailabilityGroups tmpAvailabilityGroups
5707 INNER JOIN (SELECT tmpAvailabilityGroups.AvailabilityGroupName, MIN(SelectedAvailabilityGroups.StartPosition) AS StartPosition
5708 FROM @tmpAvailabilityGroups tmpAvailabilityGroups
5709 INNER JOIN @SelectedAvailabilityGroups SelectedAvailabilityGroups
5710 ON tmpAvailabilityGroups.AvailabilityGroupName LIKE REPLACE(SelectedAvailabilityGroups.AvailabilityGroupName,'_','[_]')
5711 WHERE SelectedAvailabilityGroups.Selected = 1
5712 GROUP BY tmpAvailabilityGroups.AvailabilityGroupName) SelectedAvailabilityGroups2
5713 ON tmpAvailabilityGroups.AvailabilityGroupName = SelectedAvailabilityGroups2.AvailabilityGroupName
5714
5715 UPDATE tmpDatabases
5716 SET tmpDatabases.StartPosition = tmpAvailabilityGroups.StartPosition,
5717 tmpDatabases.Selected = 1
5718 FROM @tmpDatabases tmpDatabases
5719 INNER JOIN @tmpDatabasesAvailabilityGroups tmpDatabasesAvailabilityGroups ON tmpDatabases.DatabaseName = tmpDatabasesAvailabilityGroups.DatabaseName
5720 INNER JOIN @tmpAvailabilityGroups tmpAvailabilityGroups ON tmpDatabasesAvailabilityGroups.AvailabilityGroupName = tmpAvailabilityGroups.AvailabilityGroupName
5721 WHERE tmpAvailabilityGroups.Selected = 1
5722
5723 END
5724
5725 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)
5726 BEGIN
5727 SET @ErrorMessage = 'The value for the parameter @AvailabilityGroups is not supported.' + CHAR(13) + CHAR(10) + ' '
5728 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
5729 SET @Error = @@ERROR
5730 END
5731
5732 IF (@Databases IS NULL AND @AvailabilityGroups IS NULL)
5733 BEGIN
5734 SET @ErrorMessage = 'You need to specify one of the parameters @Databases and @AvailabilityGroups.' + CHAR(13) + CHAR(10) + ' '
5735 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
5736 SET @Error = @@ERROR
5737 END
5738
5739 IF (@Databases IS NOT NULL AND @AvailabilityGroups IS NOT NULL)
5740 BEGIN
5741 SET @ErrorMessage = 'You can only specify one of the parameters @Databases and @AvailabilityGroups.' + CHAR(13) + CHAR(10) + ' '
5742 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
5743 SET @Error = @@ERROR
5744 END
5745
5746 ----------------------------------------------------------------------------------------------------
5747 --// Select indexes //--
5748 ----------------------------------------------------------------------------------------------------
5749
5750 SET @Indexes = REPLACE(@Indexes, CHAR(10), '')
5751 SET @Indexes = REPLACE(@Indexes, CHAR(13), '')
5752
5753 WHILE CHARINDEX(', ',@Indexes) > 0 SET @Indexes = REPLACE(@Indexes,', ',',')
5754 WHILE CHARINDEX(' ,',@Indexes) > 0 SET @Indexes = REPLACE(@Indexes,' ,',',')
5755
5756 SET @Indexes = LTRIM(RTRIM(@Indexes));
5757
5758 WITH Indexes1 (StartPosition, EndPosition, IndexItem) AS
5759 (
5760 SELECT 1 AS StartPosition,
5761 ISNULL(NULLIF(CHARINDEX(',', @Indexes, 1), 0), LEN(@Indexes) + 1) AS EndPosition,
5762 SUBSTRING(@Indexes, 1, ISNULL(NULLIF(CHARINDEX(',', @Indexes, 1), 0), LEN(@Indexes) + 1) - 1) AS IndexItem
5763 WHERE @Indexes IS NOT NULL
5764 UNION ALL
5765 SELECT CAST(EndPosition AS int) + 1 AS StartPosition,
5766 ISNULL(NULLIF(CHARINDEX(',', @Indexes, EndPosition + 1), 0), LEN(@Indexes) + 1) AS EndPosition,
5767 SUBSTRING(@Indexes, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(',', @Indexes, EndPosition + 1), 0), LEN(@Indexes) + 1) - EndPosition - 1) AS IndexItem
5768 FROM Indexes1
5769 WHERE EndPosition < LEN(@Indexes) + 1
5770 ),
5771 Indexes2 (IndexItem, StartPosition, Selected) AS
5772 (
5773 SELECT CASE WHEN IndexItem LIKE '-%' THEN RIGHT(IndexItem,LEN(IndexItem) - 1) ELSE IndexItem END AS IndexItem,
5774 StartPosition,
5775 CASE WHEN IndexItem LIKE '-%' THEN 0 ELSE 1 END AS Selected
5776 FROM Indexes1
5777 ),
5778 Indexes3 (IndexItem, StartPosition, Selected) AS
5779 (
5780 SELECT CASE WHEN IndexItem = 'ALL_INDEXES' THEN '%.%.%.%' ELSE IndexItem END AS IndexItem,
5781 StartPosition,
5782 Selected
5783 FROM Indexes2
5784 ),
5785 Indexes4 (DatabaseName, SchemaName, ObjectName, IndexName, StartPosition, Selected) AS
5786 (
5787 SELECT CASE WHEN PARSENAME(IndexItem,4) IS NULL THEN PARSENAME(IndexItem,3) ELSE PARSENAME(IndexItem,4) END AS DatabaseName,
5788 CASE WHEN PARSENAME(IndexItem,4) IS NULL THEN PARSENAME(IndexItem,2) ELSE PARSENAME(IndexItem,3) END AS SchemaName,
5789 CASE WHEN PARSENAME(IndexItem,4) IS NULL THEN PARSENAME(IndexItem,1) ELSE PARSENAME(IndexItem,2) END AS ObjectName,
5790 CASE WHEN PARSENAME(IndexItem,4) IS NULL THEN '%' ELSE PARSENAME(IndexItem,1) END AS IndexName,
5791 StartPosition,
5792 Selected
5793 FROM Indexes3
5794 )
5795 INSERT INTO @SelectedIndexes (DatabaseName, SchemaName, ObjectName, IndexName, StartPosition, Selected)
5796 SELECT DatabaseName, SchemaName, ObjectName, IndexName, StartPosition, Selected
5797 FROM Indexes4
5798 OPTION (MAXRECURSION 0);
5799
5800 ----------------------------------------------------------------------------------------------------
5801 --// Select actions //--
5802 ----------------------------------------------------------------------------------------------------
5803
5804 WITH FragmentationLow (StartPosition, EndPosition, [Action]) AS
5805 (
5806 SELECT 1 AS StartPosition,
5807 ISNULL(NULLIF(CHARINDEX(',', @FragmentationLow, 1), 0), LEN(@FragmentationLow) + 1) AS EndPosition,
5808 SUBSTRING(@FragmentationLow, 1, ISNULL(NULLIF(CHARINDEX(',', @FragmentationLow, 1), 0), LEN(@FragmentationLow) + 1) - 1) AS [Action]
5809 WHERE @FragmentationLow IS NOT NULL
5810 UNION ALL
5811 SELECT CAST(EndPosition AS int) + 1 AS StartPosition,
5812 ISNULL(NULLIF(CHARINDEX(',', @FragmentationLow, EndPosition + 1), 0), LEN(@FragmentationLow) + 1) AS EndPosition,
5813 SUBSTRING(@FragmentationLow, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(',', @FragmentationLow, EndPosition + 1), 0), LEN(@FragmentationLow) + 1) - EndPosition - 1) AS [Action]
5814 FROM FragmentationLow
5815 WHERE EndPosition < LEN(@FragmentationLow) + 1
5816 )
5817 INSERT INTO @ActionsPreferred(FragmentationGroup, [Priority], [Action])
5818 SELECT 'Low' AS FragmentationGroup,
5819 ROW_NUMBER() OVER(ORDER BY StartPosition ASC) AS [Priority],
5820 [Action]
5821 FROM FragmentationLow
5822 OPTION (MAXRECURSION 0);
5823
5824 WITH FragmentationMedium (StartPosition, EndPosition, [Action]) AS
5825 (
5826 SELECT 1 AS StartPosition,
5827 ISNULL(NULLIF(CHARINDEX(',', @FragmentationMedium, 1), 0), LEN(@FragmentationMedium) + 1) AS EndPosition,
5828 SUBSTRING(@FragmentationMedium, 1, ISNULL(NULLIF(CHARINDEX(',', @FragmentationMedium, 1), 0), LEN(@FragmentationMedium) + 1) - 1) AS [Action]
5829 WHERE @FragmentationMedium IS NOT NULL
5830 UNION ALL
5831 SELECT CAST(EndPosition AS int) + 1 AS StartPosition,
5832 ISNULL(NULLIF(CHARINDEX(',', @FragmentationMedium, EndPosition + 1), 0), LEN(@FragmentationMedium) + 1) AS EndPosition,
5833 SUBSTRING(@FragmentationMedium, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(',', @FragmentationMedium, EndPosition + 1), 0), LEN(@FragmentationMedium) + 1) - EndPosition - 1) AS [Action]
5834 FROM FragmentationMedium
5835 WHERE EndPosition < LEN(@FragmentationMedium) + 1
5836 )
5837 INSERT INTO @ActionsPreferred(FragmentationGroup, [Priority], [Action])
5838 SELECT 'Medium' AS FragmentationGroup,
5839 ROW_NUMBER() OVER(ORDER BY StartPosition ASC) AS [Priority],
5840 [Action]
5841 FROM FragmentationMedium
5842 OPTION (MAXRECURSION 0);
5843
5844 WITH FragmentationHigh (StartPosition, EndPosition, [Action]) AS
5845 (
5846 SELECT 1 AS StartPosition,
5847 ISNULL(NULLIF(CHARINDEX(',', @FragmentationHigh, 1), 0), LEN(@FragmentationHigh) + 1) AS EndPosition,
5848 SUBSTRING(@FragmentationHigh, 1, ISNULL(NULLIF(CHARINDEX(',', @FragmentationHigh, 1), 0), LEN(@FragmentationHigh) + 1) - 1) AS [Action]
5849 WHERE @FragmentationHigh IS NOT NULL
5850 UNION ALL
5851 SELECT CAST(EndPosition AS int) + 1 AS StartPosition,
5852 ISNULL(NULLIF(CHARINDEX(',', @FragmentationHigh, EndPosition + 1), 0), LEN(@FragmentationHigh) + 1) AS EndPosition,
5853 SUBSTRING(@FragmentationHigh, EndPosition + 1, ISNULL(NULLIF(CHARINDEX(',', @FragmentationHigh, EndPosition + 1), 0), LEN(@FragmentationHigh) + 1) - EndPosition - 1) AS [Action]
5854 FROM FragmentationHigh
5855 WHERE EndPosition < LEN(@FragmentationHigh) + 1
5856 )
5857 INSERT INTO @ActionsPreferred(FragmentationGroup, [Priority], [Action])
5858 SELECT 'High' AS FragmentationGroup,
5859 ROW_NUMBER() OVER(ORDER BY StartPosition ASC) AS [Priority],
5860 [Action]
5861 FROM FragmentationHigh
5862 OPTION (MAXRECURSION 0)
5863
5864 ----------------------------------------------------------------------------------------------------
5865 --// Check input parameters //--
5866 ----------------------------------------------------------------------------------------------------
5867
5868 IF EXISTS (SELECT [Action] FROM @ActionsPreferred WHERE FragmentationGroup = 'Low' AND [Action] NOT IN(SELECT * FROM @Actions))
5869 OR EXISTS(SELECT * FROM @ActionsPreferred WHERE FragmentationGroup = 'Low' GROUP BY [Action] HAVING COUNT(*) > 1)
5870 BEGIN
5871 SET @ErrorMessage = 'The value for the parameter @FragmentationLow is not supported.' + CHAR(13) + CHAR(10) + ' '
5872 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
5873 SET @Error = @@ERROR
5874 END
5875
5876 IF EXISTS (SELECT [Action] FROM @ActionsPreferred WHERE FragmentationGroup = 'Medium' AND [Action] NOT IN(SELECT * FROM @Actions))
5877 OR EXISTS(SELECT * FROM @ActionsPreferred WHERE FragmentationGroup = 'Medium' GROUP BY [Action] HAVING COUNT(*) > 1)
5878 BEGIN
5879 SET @ErrorMessage = 'The value for the parameter @FragmentationMedium is not supported.' + CHAR(13) + CHAR(10) + ' '
5880 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
5881 SET @Error = @@ERROR
5882 END
5883
5884 IF EXISTS (SELECT [Action] FROM @ActionsPreferred WHERE FragmentationGroup = 'High' AND [Action] NOT IN(SELECT * FROM @Actions))
5885 OR EXISTS(SELECT * FROM @ActionsPreferred WHERE FragmentationGroup = 'High' GROUP BY [Action] HAVING COUNT(*) > 1)
5886 BEGIN
5887 SET @ErrorMessage = 'The value for the parameter @FragmentationHigh is not supported.' + CHAR(13) + CHAR(10) + ' '
5888 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
5889 SET @Error = @@ERROR
5890 END
5891
5892 IF @FragmentationLevel1 <= 0 OR @FragmentationLevel1 >= 100 OR @FragmentationLevel1 >= @FragmentationLevel2 OR @FragmentationLevel1 IS NULL
5893 BEGIN
5894 SET @ErrorMessage = 'The value for the parameter @FragmentationLevel1 is not supported.' + CHAR(13) + CHAR(10) + ' '
5895 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
5896 SET @Error = @@ERROR
5897 END
5898
5899 IF @FragmentationLevel2 <= 0 OR @FragmentationLevel2 >= 100 OR @FragmentationLevel2 <= @FragmentationLevel1 OR @FragmentationLevel2 IS NULL
5900 BEGIN
5901 SET @ErrorMessage = 'The value for the parameter @FragmentationLevel2 is not supported.' + CHAR(13) + CHAR(10) + ' '
5902 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
5903 SET @Error = @@ERROR
5904 END
5905
5906 IF @MinNumberOfPages < 0 OR @MinNumberOfPages IS NULL
5907 BEGIN
5908 SET @ErrorMessage = 'The value for the parameter @MinNumberOfPages is not supported.' + CHAR(13) + CHAR(10) + ' '
5909 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
5910 SET @Error = @@ERROR
5911 END
5912
5913 IF @MaxNumberOfPages < 0
5914 BEGIN
5915 SET @ErrorMessage = 'The value for the parameter @MaxNumberOfPages is not supported.' + CHAR(13) + CHAR(10) + ' '
5916 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
5917 SET @Error = @@ERROR
5918 END
5919
5920 IF @SortInTempdb NOT IN('Y','N') OR @SortInTempdb IS NULL
5921 BEGIN
5922 SET @ErrorMessage = 'The value for the parameter @SortInTempdb is not supported.' + CHAR(13) + CHAR(10) + ' '
5923 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
5924 SET @Error = @@ERROR
5925 END
5926
5927 IF @MaxDOP < 0 OR @MaxDOP > 64
5928 BEGIN
5929 SET @ErrorMessage = 'The value for the parameter @MaxDOP is not supported.' + CHAR(13) + CHAR(10) + ' '
5930 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
5931 SET @Error = @@ERROR
5932 END
5933
5934 IF @FillFactor <= 0 OR @FillFactor > 100
5935 BEGIN
5936 SET @ErrorMessage = 'The value for the parameter @FillFactor is not supported.' + CHAR(13) + CHAR(10) + ' '
5937 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
5938 SET @Error = @@ERROR
5939 END
5940
5941 IF @PadIndex NOT IN('Y','N')
5942 BEGIN
5943 SET @ErrorMessage = 'The value for the parameter @PadIndex is not supported.' + CHAR(13) + CHAR(10) + ' '
5944 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
5945 SET @Error = @@ERROR
5946 END
5947
5948 IF @LOBCompaction NOT IN('Y','N') OR @LOBCompaction IS NULL
5949 BEGIN
5950 SET @ErrorMessage = 'The value for the parameter @LOBCompaction is not supported.' + CHAR(13) + CHAR(10) + ' '
5951 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
5952 SET @Error = @@ERROR
5953 END
5954
5955 IF @UpdateStatistics NOT IN('ALL','COLUMNS','INDEX')
5956 BEGIN
5957 SET @ErrorMessage = 'The value for the parameter @UpdateStatistics is not supported.' + CHAR(13) + CHAR(10) + ' '
5958 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
5959 SET @Error = @@ERROR
5960 END
5961
5962 IF @OnlyModifiedStatistics NOT IN('Y','N') OR @OnlyModifiedStatistics IS NULL
5963 BEGIN
5964 SET @ErrorMessage = 'The value for the parameter @OnlyModifiedStatistics is not supported.' + CHAR(13) + CHAR(10) + ' '
5965 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
5966 SET @Error = @@ERROR
5967 END
5968
5969 IF @StatisticsModificationLevel <= 0 OR @StatisticsModificationLevel > 100
5970 BEGIN
5971 SET @ErrorMessage = 'The value for the parameter @StatisticsModificationLevel is not supported.' + CHAR(13) + CHAR(10) + ' '
5972 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
5973 SET @Error = @@ERROR
5974 END
5975
5976 IF @OnlyModifiedStatistics = 'Y' AND @StatisticsModificationLevel IS NOT NULL
5977 BEGIN
5978 SET @ErrorMessage = 'You can only specify one of the parameters @OnlyModifiedStatistics and @StatisticsModificationLevel.' + CHAR(13) + CHAR(10) + ' '
5979 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
5980 SET @Error = @@ERROR
5981 END
5982
5983 IF @StatisticsSample <= 0 OR @StatisticsSample > 100
5984 BEGIN
5985 SET @ErrorMessage = 'The value for the parameter @StatisticsSample is not supported.' + CHAR(13) + CHAR(10) + ' '
5986 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
5987 SET @Error = @@ERROR
5988 END
5989
5990 IF @StatisticsResample NOT IN('Y','N') OR @StatisticsResample IS NULL OR (@StatisticsResample = 'Y' AND @StatisticsSample IS NOT NULL)
5991 BEGIN
5992 SET @ErrorMessage = 'The value for the parameter @StatisticsResample is not supported.' + CHAR(13) + CHAR(10) + ' '
5993 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
5994 SET @Error = @@ERROR
5995 END
5996
5997 IF @PartitionLevel NOT IN('Y','N') OR @PartitionLevel IS NULL
5998 BEGIN
5999 SET @ErrorMessage = 'The value for the parameter @PartitionLevel is not supported.' + CHAR(13) + CHAR(10) + ' '
6000 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
6001 SET @Error = @@ERROR
6002 END
6003
6004 IF @MSShippedObjects NOT IN('Y','N') OR @MSShippedObjects IS NULL
6005 BEGIN
6006 SET @ErrorMessage = 'The value for the parameter @MSShippedObjects is not supported.' + CHAR(13) + CHAR(10) + ' '
6007 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
6008 SET @Error = @@ERROR
6009 END
6010
6011 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))
6012 BEGIN
6013 SET @ErrorMessage = 'The value for the parameter @Indexes is not supported.' + CHAR(13) + CHAR(10) + ' '
6014 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
6015 SET @Error = @@ERROR
6016 END
6017
6018 IF @TimeLimit < 0
6019 BEGIN
6020 SET @ErrorMessage = 'The value for the parameter @TimeLimit is not supported.' + CHAR(13) + CHAR(10) + ' '
6021 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
6022 SET @Error = @@ERROR
6023 END
6024
6025 IF @Delay < 0
6026 BEGIN
6027 SET @ErrorMessage = 'The value for the parameter @Delay is not supported.' + CHAR(13) + CHAR(10) + ' '
6028 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
6029 SET @Error = @@ERROR
6030 END
6031
6032 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)
6033 BEGIN
6034 SET @ErrorMessage = 'The value for the parameter @WaitAtLowPriorityMaxDuration is not supported.' + CHAR(13) + CHAR(10) + ' '
6035 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
6036 SET @Error = @@ERROR
6037 END
6038
6039 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)
6040 BEGIN
6041 SET @ErrorMessage = 'The value for the parameter @WaitAtLowPriorityAbortAfterWait is not supported.' + CHAR(13) + CHAR(10) + ' '
6042 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
6043 SET @Error = @@ERROR
6044 END
6045
6046 IF @Resumable NOT IN('Y','N') OR @Resumable IS NULL OR (@Resumable = 'Y' AND NOT (@Version >= 14 OR SERVERPROPERTY('EngineEdition') IN (5,8)))
6047 BEGIN
6048 SET @ErrorMessage = 'The value for the parameter @Resumable is not supported.' + CHAR(13) + CHAR(10) + ' '
6049 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
6050 SET @Error = @@ERROR
6051 END
6052
6053 IF @Resumable = 'Y' AND @SortInTempdb = 'Y'
6054 BEGIN
6055 SET @ErrorMessage = 'You can only specify one of the parameters @Resumable and @SortInTempdb.' + CHAR(13) + CHAR(10) + ' '
6056 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
6057 SET @Error = @@ERROR
6058 END
6059
6060 IF @LockTimeout < 0
6061 BEGIN
6062 SET @ErrorMessage = 'The value for the parameter @LockTimeout is not supported.' + CHAR(13) + CHAR(10) + ' '
6063 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
6064 SET @Error = @@ERROR
6065 END
6066
6067 IF @LockMessageSeverity NOT IN(10,16)
6068 BEGIN
6069 SET @ErrorMessage = 'The value for the parameter @LockMessageSeverity is not supported.' + CHAR(13) + CHAR(10) + ' '
6070 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
6071 SET @Error = @@ERROR
6072 END
6073
6074 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)
6075 BEGIN
6076 SET @ErrorMessage = 'The value for the parameter @DatabaseOrder is not supported.' + CHAR(13) + CHAR(10) + ' '
6077 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
6078 SET @Error = @@ERROR
6079 END
6080
6081 IF @DatabasesInParallel NOT IN('Y','N') OR @DatabasesInParallel IS NULL OR (@DatabasesInParallel = 'Y' AND SERVERPROPERTY('EngineEdition') = 5)
6082 BEGIN
6083 SET @ErrorMessage = 'The value for the parameter @DatabasesInParallel is not supported.' + CHAR(13) + CHAR(10) + ' '
6084 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
6085 SET @Error = @@ERROR
6086 END
6087
6088 IF @LogToTable NOT IN('Y','N') OR @LogToTable IS NULL
6089 BEGIN
6090 SET @ErrorMessage = 'The value for the parameter @LogToTable is not supported.' + CHAR(13) + CHAR(10) + ' '
6091 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
6092 SET @Error = @@ERROR
6093 END
6094
6095 IF @Execute NOT IN('Y','N') OR @Execute IS NULL
6096 BEGIN
6097 SET @ErrorMessage = 'The value for the parameter @Execute is not supported.' + CHAR(13) + CHAR(10) + ' '
6098 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
6099 SET @Error = @@ERROR
6100 END
6101
6102 IF @Error <> 0
6103 BEGIN
6104 SET @ErrorMessage = 'The documentation is available at https://FixSQL.co.uk/sql-server-index-and-statistics-maintenance.html.' + CHAR(13) + CHAR(10) + ' '
6105 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
6106 SET @ReturnCode = @Error
6107 GOTO Logging
6108 END
6109
6110 ----------------------------------------------------------------------------------------------------
6111 --// Check that selected databases and availability groups exist //--
6112 ----------------------------------------------------------------------------------------------------
6113
6114 SET @ErrorMessage = ''
6115 SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + ', '
6116 FROM @SelectedDatabases
6117 WHERE DatabaseName NOT LIKE '%[%]%'
6118 AND DatabaseName NOT IN (SELECT DatabaseName FROM @tmpDatabases)
6119 IF @@ROWCOUNT > 0
6120 BEGIN
6121 SET @ErrorMessage = 'The following databases in the @Databases parameter do not exist: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.' + CHAR(13) + CHAR(10) + ' '
6122 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
6123 SET @Error = @@ERROR
6124 END
6125
6126 SET @ErrorMessage = ''
6127 SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + ', '
6128 FROM @SelectedIndexes
6129 WHERE DatabaseName NOT LIKE '%[%]%'
6130 AND DatabaseName NOT IN (SELECT DatabaseName FROM @tmpDatabases)
6131 IF @@ROWCOUNT > 0
6132 BEGIN
6133 SET @ErrorMessage = 'The following databases in the @Indexes parameter do not exist: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.' + CHAR(13) + CHAR(10) + ' '
6134 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
6135 SET @Error = @@ERROR
6136 END
6137
6138 SET @ErrorMessage = ''
6139 SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(AvailabilityGroupName) + ', '
6140 FROM @SelectedAvailabilityGroups
6141 WHERE AvailabilityGroupName NOT LIKE '%[%]%'
6142 AND AvailabilityGroupName NOT IN (SELECT AvailabilityGroupName FROM @tmpAvailabilityGroups)
6143 IF @@ROWCOUNT > 0
6144 BEGIN
6145 SET @ErrorMessage = 'The following availability groups do not exist: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.' + CHAR(13) + CHAR(10) + ' '
6146 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
6147 SET @Error = @@ERROR
6148 END
6149
6150 SET @ErrorMessage = ''
6151 SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + ', '
6152 FROM @SelectedIndexes
6153 WHERE DatabaseName NOT LIKE '%[%]%'
6154 AND DatabaseName IN (SELECT DatabaseName FROM @tmpDatabases)
6155 AND DatabaseName NOT IN (SELECT DatabaseName FROM @tmpDatabases WHERE Selected = 1)
6156 IF @@ROWCOUNT > 0
6157 BEGIN
6158 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) + '.' + CHAR(13) + CHAR(10) + ' '
6159 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
6160 SET @Error = @@ERROR
6161 END
6162
6163 ----------------------------------------------------------------------------------------------------
6164 --// Should statistics be updated on the partition level? //--
6165 ----------------------------------------------------------------------------------------------------
6166
6167 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
6168
6169 ----------------------------------------------------------------------------------------------------
6170 --// Update database order //--
6171 ----------------------------------------------------------------------------------------------------
6172
6173 IF @DatabaseOrder IN('DATABASE_SIZE_ASC','DATABASE_SIZE_DESC')
6174 BEGIN
6175 UPDATE tmpDatabases
6176 SET DatabaseSize = (SELECT SUM(size) FROM sys.master_files WHERE [type] = 0 AND database_id = DB_ID(tmpDatabases.DatabaseName))
6177 FROM @tmpDatabases tmpDatabases
6178 END
6179
6180 IF @DatabaseOrder IS NULL
6181 BEGIN
6182 WITH tmpDatabases AS (
6183 SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY StartPosition ASC, DatabaseName ASC) AS RowNumber
6184 FROM @tmpDatabases tmpDatabases
6185 WHERE Selected = 1
6186 )
6187 UPDATE tmpDatabases
6188 SET [Order] = RowNumber
6189 END
6190 ELSE
6191 IF @DatabaseOrder = 'DATABASE_NAME_ASC'
6192 BEGIN
6193 WITH tmpDatabases AS (
6194 SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY DatabaseName ASC) AS RowNumber
6195 FROM @tmpDatabases tmpDatabases
6196 WHERE Selected = 1
6197 )
6198 UPDATE tmpDatabases
6199 SET [Order] = RowNumber
6200 END
6201 ELSE
6202 IF @DatabaseOrder = 'DATABASE_NAME_DESC'
6203 BEGIN
6204 WITH tmpDatabases AS (
6205 SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY DatabaseName DESC) AS RowNumber
6206 FROM @tmpDatabases tmpDatabases
6207 WHERE Selected = 1
6208 )
6209 UPDATE tmpDatabases
6210 SET [Order] = RowNumber
6211 END
6212 ELSE
6213 IF @DatabaseOrder = 'DATABASE_SIZE_ASC'
6214 BEGIN
6215 WITH tmpDatabases AS (
6216 SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY DatabaseSize ASC) AS RowNumber
6217 FROM @tmpDatabases tmpDatabases
6218 WHERE Selected = 1
6219 )
6220 UPDATE tmpDatabases
6221 SET [Order] = RowNumber
6222 END
6223 ELSE
6224 IF @DatabaseOrder = 'DATABASE_SIZE_DESC'
6225 BEGIN
6226 WITH tmpDatabases AS (
6227 SELECT DatabaseName, [Order], ROW_NUMBER() OVER (ORDER BY DatabaseSize DESC) AS RowNumber
6228 FROM @tmpDatabases tmpDatabases
6229 WHERE Selected = 1
6230 )
6231 UPDATE tmpDatabases
6232 SET [Order] = RowNumber
6233 END
6234
6235 ----------------------------------------------------------------------------------------------------
6236 --// Update the queue //--
6237 ----------------------------------------------------------------------------------------------------
6238
6239 IF @DatabasesInParallel = 'Y'
6240 BEGIN
6241
6242 BEGIN TRY
6243
6244 SELECT @QueueID = QueueID
6245 FROM dbo.[Queue]
6246 WHERE SchemaName = @SchemaName
6247 AND ObjectName = @ObjectName
6248 AND [Parameters] = @Parameters
6249
6250 IF @QueueID IS NULL
6251 BEGIN
6252 BEGIN TRANSACTION
6253
6254 SELECT @QueueID = QueueID
6255 FROM dbo.[Queue] WITH (UPDLOCK, TABLOCK)
6256 WHERE SchemaName = @SchemaName
6257 AND ObjectName = @ObjectName
6258 AND [Parameters] = @Parameters
6259
6260 IF @QueueID IS NULL
6261 BEGIN
6262 INSERT INTO dbo.[Queue] (SchemaName, ObjectName, [Parameters])
6263 SELECT @SchemaName, @ObjectName, @Parameters
6264
6265 SET @QueueID = SCOPE_IDENTITY()
6266 END
6267
6268 COMMIT TRANSACTION
6269 END
6270
6271 BEGIN TRANSACTION
6272
6273 UPDATE [Queue]
6274 SET QueueStartTime = GETDATE(),
6275 SessionID = @@SPID,
6276 RequestID = (SELECT request_id FROM sys.dm_exec_requests WHERE session_id = @@SPID),
6277 RequestStartTime = (SELECT start_time FROM sys.dm_exec_requests WHERE session_id = @@SPID)
6278 FROM dbo.[Queue] [Queue]
6279 WHERE QueueID = @QueueID
6280 AND NOT EXISTS (SELECT *
6281 FROM sys.dm_exec_requests
6282 WHERE session_id = [Queue].SessionID
6283 AND request_id = [Queue].RequestID
6284 AND start_time = [Queue].RequestStartTime)
6285 AND NOT EXISTS (SELECT *
6286 FROM dbo.QueueDatabase QueueDatabase
6287 INNER JOIN sys.dm_exec_requests ON QueueDatabase.SessionID = session_id AND QueueDatabase.RequestID = request_id AND QueueDatabase.RequestStartTime = start_time
6288 WHERE QueueDatabase.QueueID = @QueueID)
6289
6290 IF @@ROWCOUNT = 1
6291 BEGIN
6292 INSERT INTO dbo.QueueDatabase (QueueID, DatabaseName)
6293 SELECT @QueueID AS QueueID,
6294 DatabaseName
6295 FROM @tmpDatabases tmpDatabases
6296 WHERE Selected = 1
6297 AND NOT EXISTS (SELECT * FROM dbo.QueueDatabase WHERE DatabaseName = tmpDatabases.DatabaseName AND QueueID = @QueueID)
6298
6299 DELETE QueueDatabase
6300 FROM dbo.QueueDatabase QueueDatabase
6301 WHERE QueueID = @QueueID
6302 AND NOT EXISTS (SELECT * FROM @tmpDatabases tmpDatabases WHERE DatabaseName = QueueDatabase.DatabaseName AND Selected = 1)
6303
6304 UPDATE QueueDatabase
6305 SET DatabaseOrder = tmpDatabases.[Order]
6306 FROM dbo.QueueDatabase QueueDatabase
6307 INNER JOIN @tmpDatabases tmpDatabases ON QueueDatabase.DatabaseName = tmpDatabases.DatabaseName
6308 WHERE QueueID = @QueueID
6309 END
6310
6311 COMMIT TRANSACTION
6312
6313 SELECT @QueueStartTime = QueueStartTime
6314 FROM dbo.[Queue]
6315 WHERE QueueID = @QueueID
6316
6317 END TRY
6318
6319 BEGIN CATCH
6320 IF XACT_STATE() <> 0
6321 BEGIN
6322 ROLLBACK TRANSACTION
6323 END
6324 SET @ErrorMessage = 'Msg ' + CAST(ERROR_NUMBER() AS nvarchar) + ', ' + ISNULL(ERROR_MESSAGE(),'') + CHAR(13) + CHAR(10) + ' '
6325 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
6326 SET @ReturnCode = ERROR_NUMBER()
6327 GOTO Logging
6328 END CATCH
6329
6330 END
6331
6332 ----------------------------------------------------------------------------------------------------
6333 --// Execute commands //--
6334 ----------------------------------------------------------------------------------------------------
6335
6336 WHILE (1 = 1)
6337 BEGIN
6338
6339 IF @DatabasesInParallel = 'Y'
6340 BEGIN
6341 UPDATE QueueDatabase
6342 SET DatabaseStartTime = NULL,
6343 SessionID = NULL,
6344 RequestID = NULL,
6345 RequestStartTime = NULL
6346 FROM dbo.QueueDatabase QueueDatabase
6347 WHERE QueueID = @QueueID
6348 AND DatabaseStartTime IS NOT NULL
6349 AND DatabaseEndTime IS NULL
6350 AND NOT EXISTS (SELECT * FROM sys.dm_exec_requests WHERE session_id = QueueDatabase.SessionID AND request_id = QueueDatabase.RequestID AND start_time = QueueDatabase.RequestStartTime)
6351
6352 UPDATE QueueDatabase
6353 SET DatabaseStartTime = GETDATE(),
6354 DatabaseEndTime = NULL,
6355 SessionID = @@SPID,
6356 RequestID = (SELECT request_id FROM sys.dm_exec_requests WHERE session_id = @@SPID),
6357 RequestStartTime = (SELECT start_time FROM sys.dm_exec_requests WHERE session_id = @@SPID),
6358 @CurrentDatabaseName = DatabaseName
6359 FROM (SELECT TOP 1 DatabaseStartTime,
6360 DatabaseEndTime,
6361 SessionID,
6362 RequestID,
6363 RequestStartTime,
6364 DatabaseName
6365 FROM dbo.QueueDatabase
6366 WHERE QueueID = @QueueID
6367 AND (DatabaseStartTime < @QueueStartTime OR DatabaseStartTime IS NULL)
6368 AND NOT (DatabaseStartTime IS NOT NULL AND DatabaseEndTime IS NULL)
6369 ORDER BY DatabaseOrder ASC
6370 ) QueueDatabase
6371 END
6372 ELSE
6373 BEGIN
6374 SELECT TOP 1 @CurrentDBID = ID,
6375 @CurrentDatabaseName = DatabaseName
6376 FROM @tmpDatabases
6377 WHERE Selected = 1
6378 AND Completed = 0
6379 ORDER BY [Order] ASC
6380 END
6381
6382 IF @@ROWCOUNT = 0
6383 BEGIN
6384 BREAK
6385 END
6386
6387 SET @CurrentDatabaseID = DB_ID(@CurrentDatabaseName)
6388
6389 IF DATABASEPROPERTYEX(@CurrentDatabaseName,'Status') = 'ONLINE' AND SERVERPROPERTY('EngineEdition') <> 5
6390 BEGIN
6391 IF EXISTS (SELECT * FROM sys.database_recovery_status WHERE database_id = @CurrentDatabaseID AND database_guid IS NOT NULL)
6392 BEGIN
6393 SET @CurrentIsDatabaseAccessible = 1
6394 END
6395 ELSE
6396 BEGIN
6397 SET @CurrentIsDatabaseAccessible = 0
6398 END
6399 END
6400
6401 IF @Version >= 11 AND SERVERPROPERTY('IsHadrEnabled') = 1
6402 BEGIN
6403 SELECT @CurrentAvailabilityGroup = availability_groups.name,
6404 @CurrentAvailabilityGroupRole = dm_hadr_availability_replica_states.role_desc
6405 FROM sys.databases databases
6406 INNER JOIN sys.availability_databases_cluster availability_databases_cluster ON databases.group_database_id = availability_databases_cluster.group_database_id
6407 INNER JOIN sys.availability_groups availability_groups ON availability_databases_cluster.group_id = availability_groups.group_id
6408 INNER JOIN sys.dm_hadr_availability_replica_states dm_hadr_availability_replica_states ON availability_groups.group_id = dm_hadr_availability_replica_states.group_id AND databases.replica_id = dm_hadr_availability_replica_states.replica_id
6409 WHERE databases.name = @CurrentDatabaseName
6410 END
6411
6412 IF SERVERPROPERTY('EngineEdition') <> 5
6413 BEGIN
6414 SELECT @CurrentDatabaseMirroringRole = UPPER(mirroring_role_desc)
6415 FROM sys.database_mirroring
6416 WHERE database_id = @CurrentDatabaseID
6417 END
6418
6419 SELECT @CurrentIsReadOnly = is_read_only
6420 FROM sys.databases
6421 WHERE name = @CurrentDatabaseName
6422
6423 SET @DatabaseMessage = 'Date and time: ' + CONVERT(nvarchar,GETDATE(),120)
6424 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
6425
6426 SET @DatabaseMessage = 'Database: ' + QUOTENAME(@CurrentDatabaseName)
6427 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
6428
6429 SET @DatabaseMessage = 'Status: ' + CAST(DATABASEPROPERTYEX(@CurrentDatabaseName,'Status') AS nvarchar)
6430 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
6431
6432 SET @DatabaseMessage = 'Standby: ' + CASE WHEN DATABASEPROPERTYEX(@CurrentDatabaseName,'IsInStandBy') = 1 THEN 'Yes' ELSE 'No' END
6433 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
6434
6435 SET @DatabaseMessage = 'Updateability: ' + CASE WHEN @CurrentIsReadOnly = 1 THEN 'READ_ONLY' WHEN @CurrentIsReadOnly = 0 THEN 'READ_WRITE' END
6436 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
6437
6438 SET @DatabaseMessage = 'User access: ' + CAST(DATABASEPROPERTYEX(@CurrentDatabaseName,'UserAccess') AS nvarchar)
6439 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
6440
6441 IF @CurrentIsDatabaseAccessible IS NOT NULL
6442 BEGIN
6443 SET @DatabaseMessage = 'Is accessible: ' + CASE WHEN @CurrentIsDatabaseAccessible = 1 THEN 'Yes' ELSE 'No' END
6444 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
6445 END
6446
6447 SET @DatabaseMessage = 'Recovery model: ' + CAST(DATABASEPROPERTYEX(@CurrentDatabaseName,'Recovery') AS nvarchar)
6448 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
6449
6450 IF @CurrentAvailabilityGroup IS NOT NULL
6451 BEGIN
6452 SET @DatabaseMessage = 'Availability group: ' + @CurrentAvailabilityGroup
6453 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
6454
6455 SET @DatabaseMessage = 'Availability group role: ' + @CurrentAvailabilityGroupRole
6456 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
6457 END
6458
6459 IF @CurrentDatabaseMirroringRole IS NOT NULL
6460 BEGIN
6461 SET @DatabaseMessage = 'Database mirroring role: ' + @CurrentDatabaseMirroringRole
6462 RAISERROR(@DatabaseMessage,10,1) WITH NOWAIT
6463 END
6464
6465 RAISERROR('',10,1) WITH NOWAIT
6466
6467 IF DATABASEPROPERTYEX(@CurrentDatabaseName,'Status') = 'ONLINE'
6468 AND (@CurrentIsDatabaseAccessible = 1 OR @CurrentIsDatabaseAccessible IS NULL)
6469 AND DATABASEPROPERTYEX(@CurrentDatabaseName,'Updateability') = 'READ_WRITE'
6470 BEGIN
6471
6472 -- Select indexes in the current database
6473 IF (EXISTS(SELECT * FROM @ActionsPreferred) OR @UpdateStatistics IS NOT NULL) AND (GETDATE() < DATEADD(ss,@TimeLimit,@StartTime) OR @TimeLimit IS NULL)
6474 BEGIN
6475 SET @CurrentCommand01 = 'SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;'
6476 + 'USE ' + QUOTENAME(@CurrentDatabaseName) + ';'
6477 + ' 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'
6478 + ' FROM ('
6479
6480 IF EXISTS(SELECT * FROM @ActionsPreferred) OR @UpdateStatistics IN('ALL','INDEX')
6481 BEGIN
6482 SET @CurrentCommand01 = @CurrentCommand01 + 'SELECT schemas.[schema_id] AS SchemaID'
6483 + ', schemas.[name] AS SchemaName'
6484 + ', objects.[object_id] AS ObjectID'
6485 + ', objects.[name] AS ObjectName'
6486 + ', RTRIM(objects.[type]) AS ObjectType'
6487 + ', ' + CASE WHEN @Version >= 12 THEN 'tables.is_memory_optimized' ELSE '0' END + ' AS IsMemoryOptimized'
6488 + ', indexes.index_id AS IndexID'
6489 + ', indexes.[name] AS IndexName'
6490 + ', indexes.[type] AS IndexType'
6491 + ', indexes.allow_page_locks AS AllowPageLocks'
6492
6493 + ', 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'
6494
6495 + ', 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'
6496 + ' 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'
6497
6498 + ', 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'
6499
6500 + ', 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'
6501
6502 + ', 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'
6503
6504 + ', 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'
6505
6506 + ', 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'
6507 + ' 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'
6508 + ' 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'
6509
6510 + ', ' + 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'
6511
6512 + ', stats.stats_id AS StatisticsID'
6513 + ', stats.name AS StatisticsName'
6514 + ', stats.no_recompute AS NoRecompute'
6515 + ', ' + CASE WHEN @Version >= 12 THEN 'stats.is_incremental' ELSE '0' END + ' AS IsIncremental'
6516 + ', ' + CASE WHEN @PartitionLevel = 'Y' THEN 'partitions.partition_id AS PartitionID' WHEN @PartitionLevel = 'N' THEN 'NULL AS PartitionID' END
6517 + ', ' + CASE WHEN @PartitionLevel = 'Y' THEN 'partitions.partition_number AS PartitionNumber' WHEN @PartitionLevel = 'N' THEN 'NULL AS PartitionNumber' END
6518 + ', ' + CASE WHEN @PartitionLevel = 'Y' THEN 'IndexPartitions.partition_count AS PartitionCount' WHEN @PartitionLevel = 'N' THEN 'NULL AS PartitionCount' END
6519 + ', 0 AS [Order]'
6520 + ', 0 AS Selected'
6521 + ', 0 AS Completed'
6522 + ' FROM sys.indexes indexes'
6523 + ' INNER JOIN sys.objects objects ON indexes.[object_id] = objects.[object_id]'
6524 + ' INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id]'
6525 + ' LEFT OUTER JOIN sys.tables tables ON objects.[object_id] = tables.[object_id]'
6526 + ' LEFT OUTER JOIN sys.stats stats ON indexes.[object_id] = stats.[object_id] AND indexes.[index_id] = stats.[stats_id]'
6527 IF @PartitionLevel = 'Y'
6528 BEGIN
6529 SET @CurrentCommand01 = @CurrentCommand01 + ' LEFT OUTER JOIN sys.partitions partitions ON indexes.[object_id] = partitions.[object_id] AND indexes.index_id = partitions.index_id'
6530 + ' 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]'
6531 END
6532
6533 SET @CurrentCommand01 = @CurrentCommand01 + ' WHERE objects.[type] IN(''U'',''V'')'
6534 + CASE WHEN @MSShippedObjects = 'N' THEN ' AND objects.is_ms_shipped = 0' ELSE '' END
6535 + ' AND indexes.[type] IN(1,2,3,4,5,6,7)'
6536 + ' AND indexes.is_disabled = 0 AND indexes.is_hypothetical = 0'
6537 END
6538
6539 IF (EXISTS(SELECT * FROM @ActionsPreferred) AND @UpdateStatistics = 'COLUMNS') OR @UpdateStatistics = 'ALL'
6540 BEGIN
6541 SET @CurrentCommand01 = @CurrentCommand01 + ' UNION '
6542 END
6543
6544 IF @UpdateStatistics IN('ALL','COLUMNS')
6545 BEGIN
6546 SET @CurrentCommand01 = @CurrentCommand01 + 'SELECT schemas.[schema_id] AS SchemaID'
6547 + ', schemas.[name] AS SchemaName'
6548 + ', objects.[object_id] AS ObjectID'
6549 + ', objects.[name] AS ObjectName'
6550 + ', RTRIM(objects.[type]) AS ObjectType'
6551 + ', ' + CASE WHEN @Version >= 12 THEN 'tables.is_memory_optimized' ELSE '0' END + ' AS IsMemoryOptimized'
6552 + ', NULL AS IndexID, NULL AS IndexName'
6553 + ', NULL AS IndexType'
6554 + ', NULL AS AllowPageLocks'
6555 + ', NULL AS IsImageText'
6556 + ', NULL AS IsNewLOB'
6557 + ', NULL AS IsFileStream'
6558 + ', NULL AS IsColumnStore'
6559 + ', NULL AS IsComputed'
6560 + ', NULL AS IsTimestamp'
6561 + ', NULL AS OnReadOnlyFileGroup'
6562 + ', NULL AS ResumableIndexOperation'
6563 + ', stats.stats_id AS StatisticsID'
6564 + ', stats.name AS StatisticsName'
6565 + ', stats.no_recompute AS NoRecompute'
6566 + ', ' + CASE WHEN @Version >= 12 THEN 'stats.is_incremental' ELSE '0' END + ' AS IsIncremental'
6567 + ', NULL AS PartitionID'
6568 + ', ' + CASE WHEN @PartitionLevelStatistics = 1 THEN 'dm_db_incremental_stats_properties.partition_number' ELSE 'NULL' END + ' AS PartitionNumber'
6569 + ', NULL AS PartitionCount'
6570 + ', 0 AS [Order]'
6571 + ', 0 AS Selected'
6572 + ', 0 AS Completed'
6573 + ' FROM sys.stats stats'
6574 + ' INNER JOIN sys.objects objects ON stats.[object_id] = objects.[object_id]'
6575 + ' INNER JOIN sys.schemas schemas ON objects.[schema_id] = schemas.[schema_id]'
6576 + ' LEFT OUTER JOIN sys.tables tables ON objects.[object_id] = tables.[object_id]'
6577
6578 IF @PartitionLevelStatistics = 1
6579 BEGIN
6580 SET @CurrentCommand01 = @CurrentCommand01 + ' OUTER APPLY sys.dm_db_incremental_stats_properties(stats.object_id, stats.stats_id) dm_db_incremental_stats_properties'
6581 END
6582
6583 SET @CurrentCommand01 = @CurrentCommand01 + ' WHERE objects.[type] IN(''U'',''V'')'
6584 + CASE WHEN @MSShippedObjects = 'N' THEN ' AND objects.is_ms_shipped = 0' ELSE '' END
6585 + ' AND NOT EXISTS(SELECT * FROM sys.indexes indexes WHERE indexes.[object_id] = stats.[object_id] AND indexes.index_id = stats.stats_id)'
6586 END
6587
6588 SET @CurrentCommand01 = @CurrentCommand01 + ') IndexesStatistics'
6589
6590 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)
6591 EXECUTE sp_executesql @statement = @CurrentCommand01
6592 SET @Error = @@ERROR
6593 IF @Error <> 0
6594 BEGIN
6595 SET @ReturnCode = @Error
6596 END
6597 END
6598
6599 IF @Indexes IS NULL
6600 BEGIN
6601 UPDATE tmpIndexesStatistics
6602 SET tmpIndexesStatistics.Selected = 1
6603 FROM @tmpIndexesStatistics tmpIndexesStatistics
6604 END
6605 ELSE
6606 BEGIN
6607 UPDATE tmpIndexesStatistics
6608 SET tmpIndexesStatistics.Selected = SelectedIndexes.Selected
6609 FROM @tmpIndexesStatistics tmpIndexesStatistics
6610 INNER JOIN @SelectedIndexes SelectedIndexes
6611 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,'_','[_]')
6612 WHERE SelectedIndexes.Selected = 1
6613
6614 UPDATE tmpIndexesStatistics
6615 SET tmpIndexesStatistics.Selected = SelectedIndexes.Selected
6616 FROM @tmpIndexesStatistics tmpIndexesStatistics
6617 INNER JOIN @SelectedIndexes SelectedIndexes
6618 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,'_','[_]')
6619 WHERE SelectedIndexes.Selected = 0
6620
6621 UPDATE tmpIndexesStatistics
6622 SET tmpIndexesStatistics.StartPosition = SelectedIndexes2.StartPosition
6623 FROM @tmpIndexesStatistics tmpIndexesStatistics
6624 INNER JOIN (SELECT tmpIndexesStatistics.SchemaName, tmpIndexesStatistics.ObjectName, tmpIndexesStatistics.IndexName, tmpIndexesStatistics.StatisticsName, MIN(SelectedIndexes.StartPosition) AS StartPosition
6625 FROM @tmpIndexesStatistics tmpIndexesStatistics
6626 INNER JOIN @SelectedIndexes SelectedIndexes
6627 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,'_','[_]')
6628 WHERE SelectedIndexes.Selected = 1
6629 GROUP BY tmpIndexesStatistics.SchemaName, tmpIndexesStatistics.ObjectName, tmpIndexesStatistics.IndexName, tmpIndexesStatistics.StatisticsName) SelectedIndexes2
6630 ON tmpIndexesStatistics.SchemaName = SelectedIndexes2.SchemaName
6631 AND tmpIndexesStatistics.ObjectName = SelectedIndexes2.ObjectName
6632 AND (tmpIndexesStatistics.IndexName = SelectedIndexes2.IndexName OR tmpIndexesStatistics.IndexName IS NULL)
6633 AND (tmpIndexesStatistics.StatisticsName = SelectedIndexes2.StatisticsName OR tmpIndexesStatistics.StatisticsName IS NULL)
6634 END;
6635
6636 WITH tmpIndexesStatistics AS (
6637 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
6638 FROM @tmpIndexesStatistics tmpIndexesStatistics
6639 WHERE Selected = 1
6640 )
6641 UPDATE tmpIndexesStatistics
6642 SET [Order] = RowNumber
6643
6644 SET @ErrorMessage = ''
6645 SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + '.' + QUOTENAME(SchemaName) + '.' + QUOTENAME(ObjectName) + ', '
6646 FROM @SelectedIndexes SelectedIndexes
6647 WHERE DatabaseName = @CurrentDatabaseName
6648 AND SchemaName NOT LIKE '%[%]%'
6649 AND ObjectName NOT LIKE '%[%]%'
6650 AND IndexName LIKE '%[%]%'
6651 AND NOT EXISTS (SELECT * FROM @tmpIndexesStatistics WHERE SchemaName = SelectedIndexes.SchemaName AND ObjectName = SelectedIndexes.ObjectName)
6652 IF @@ROWCOUNT > 0
6653 BEGIN
6654 SET @ErrorMessage = 'The following objects in the @Indexes parameter do not exist: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.' + CHAR(13) + CHAR(10) + ' '
6655 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
6656 SET @Error = @@ERROR
6657 END
6658
6659 SET @ErrorMessage = ''
6660 SELECT @ErrorMessage = @ErrorMessage + QUOTENAME(DatabaseName) + QUOTENAME(SchemaName) + '.' + QUOTENAME(ObjectName) + '.' + QUOTENAME(IndexName) + ', '
6661 FROM @SelectedIndexes SelectedIndexes
6662 WHERE DatabaseName = @CurrentDatabaseName
6663 AND SchemaName NOT LIKE '%[%]%'
6664 AND ObjectName NOT LIKE '%[%]%'
6665 AND IndexName NOT LIKE '%[%]%'
6666 AND NOT EXISTS (SELECT * FROM @tmpIndexesStatistics WHERE SchemaName = SelectedIndexes.SchemaName AND ObjectName = SelectedIndexes.ObjectName AND IndexName = SelectedIndexes.IndexName)
6667 IF @@ROWCOUNT > 0
6668 BEGIN
6669 SET @ErrorMessage = 'The following indexes in the @Indexes parameter do not exist: ' + LEFT(@ErrorMessage,LEN(@ErrorMessage)-1) + '.' + CHAR(13) + CHAR(10) + ' '
6670 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
6671 SET @Error = @@ERROR
6672 END
6673
6674 WHILE (GETDATE() < DATEADD(ss,@TimeLimit,@StartTime) OR @TimeLimit IS NULL)
6675 BEGIN
6676 SELECT TOP 1 @CurrentIxID = ID,
6677 @CurrentSchemaID = SchemaID,
6678 @CurrentSchemaName = SchemaName,
6679 @CurrentObjectID = ObjectID,
6680 @CurrentObjectName = ObjectName,
6681 @CurrentObjectType = ObjectType,
6682 @CurrentIsMemoryOptimized = IsMemoryOptimized,
6683 @CurrentIndexID = IndexID,
6684 @CurrentIndexName = IndexName,
6685 @CurrentIndexType = IndexType,
6686 @CurrentAllowPageLocks = AllowPageLocks,
6687 @CurrentIsImageText = IsImageText,
6688 @CurrentIsNewLOB = IsNewLOB,
6689 @CurrentIsFileStream = IsFileStream,
6690 @CurrentIsColumnStore = IsColumnStore,
6691 @CurrentIsComputed = IsComputed,
6692 @CurrentIsTimestamp = IsTimestamp,
6693 @CurrentOnReadOnlyFileGroup = OnReadOnlyFileGroup,
6694 @CurrentResumableIndexOperation = ResumableIndexOperation,
6695 @CurrentStatisticsID = StatisticsID,
6696 @CurrentStatisticsName = StatisticsName,
6697 @CurrentNoRecompute = [NoRecompute],
6698 @CurrentIsIncremental = IsIncremental,
6699 @CurrentPartitionID = PartitionID,
6700 @CurrentPartitionNumber = PartitionNumber,
6701 @CurrentPartitionCount = PartitionCount
6702 FROM @tmpIndexesStatistics
6703 WHERE Selected = 1
6704 AND Completed = 0
6705 ORDER BY [Order] ASC
6706
6707 IF @@ROWCOUNT = 0
6708 BEGIN
6709 BREAK
6710 END
6711
6712 -- Is the index a partition?
6713 IF @CurrentPartitionNumber IS NULL OR @CurrentPartitionCount = 1 BEGIN SET @CurrentIsPartition = 0 END ELSE BEGIN SET @CurrentIsPartition = 1 END
6714
6715 -- Does the index exist?
6716 IF @CurrentIndexID IS NOT NULL AND EXISTS(SELECT * FROM @ActionsPreferred)
6717 BEGIN
6718 SET @CurrentCommand02 = ''
6719
6720 IF @LockTimeout IS NOT NULL SET @CurrentCommand02 = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; '
6721 SET @CurrentCommand02 = @CurrentCommand02 + 'USE ' + QUOTENAME(@CurrentDatabaseName) + '; '
6722
6723 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'
6724 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'
6725
6726 BEGIN TRY
6727 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
6728
6729 IF @CurrentIndexExists IS NULL
6730 BEGIN
6731 SET @CurrentIndexExists = 0
6732 GOTO NoAction
6733 END
6734 END TRY
6735 BEGIN CATCH
6736 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 + CHAR(13) + CHAR(10) + ' '
6737 SET @Severity = CASE WHEN ERROR_NUMBER() IN(1205,1222) THEN @LockMessageSeverity ELSE 16 END
6738 RAISERROR(@ErrorMessage,@Severity,1) WITH NOWAIT
6739
6740 IF NOT (ERROR_NUMBER() IN(1205,1222) AND @LockMessageSeverity = 10)
6741 BEGIN
6742 SET @ReturnCode = ERROR_NUMBER()
6743 END
6744
6745 GOTO NoAction
6746 END CATCH
6747 END
6748
6749 -- Does the statistics exist?
6750 IF @CurrentStatisticsID IS NOT NULL AND @UpdateStatistics IS NOT NULL
6751 BEGIN
6752 SET @CurrentCommand03 = ''
6753
6754 IF @LockTimeout IS NOT NULL SET @CurrentCommand03 = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; '
6755 SET @CurrentCommand03 = @CurrentCommand03 + 'USE ' + QUOTENAME(@CurrentDatabaseName) + '; '
6756
6757 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'
6758
6759 BEGIN TRY
6760 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
6761
6762 IF @CurrentStatisticsExists IS NULL
6763 BEGIN
6764 SET @CurrentStatisticsExists = 0
6765 GOTO NoAction
6766 END
6767 END TRY
6768 BEGIN CATCH
6769 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 + CHAR(13) + CHAR(10) + ' '
6770 SET @Severity = CASE WHEN ERROR_NUMBER() IN(1205,1222) THEN @LockMessageSeverity ELSE 16 END
6771 RAISERROR(@ErrorMessage,@Severity,1) WITH NOWAIT
6772
6773 IF NOT (ERROR_NUMBER() IN(1205,1222) AND @LockMessageSeverity = 10)
6774 BEGIN
6775 SET @ReturnCode = ERROR_NUMBER()
6776 END
6777
6778 GOTO NoAction
6779 END CATCH
6780 END
6781
6782 -- Has the data in the statistics been modified since the statistics was last updated?
6783 IF @CurrentStatisticsID IS NOT NULL AND @UpdateStatistics IS NOT NULL
6784 BEGIN
6785 SET @CurrentCommand04 = ''
6786
6787 IF @LockTimeout IS NOT NULL SET @CurrentCommand04 = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; '
6788 SET @CurrentCommand04 = @CurrentCommand04 + 'USE ' + QUOTENAME(@CurrentDatabaseName) + '; '
6789
6790 IF @PartitionLevelStatistics = 1 AND @CurrentIsIncremental = 1
6791 BEGIN
6792 SET @CurrentCommand04 = @CurrentCommand04 + 'SELECT @ParamRowCount = [rows], @ParamModificationCounter = modification_counter FROM sys.dm_db_incremental_stats_properties (@ParamObjectID, @ParamStatisticsID) WHERE partition_number = @ParamPartitionNumber'
6793 END
6794 ELSE
6795 IF (@Version >= 10.504000 AND @Version < 11) OR @Version >= 11.03000
6796 BEGIN
6797 SET @CurrentCommand04 = @CurrentCommand04 + 'SELECT @ParamRowCount = [rows], @ParamModificationCounter = modification_counter FROM sys.dm_db_stats_properties (@ParamObjectID, @ParamStatisticsID)'
6798 END
6799 ELSE
6800 BEGIN
6801 SET @CurrentCommand04 = @CurrentCommand04 + 'SELECT @ParamRowCount = rowcnt, @ParamModificationCounter = rowmodctr FROM sys.sysindexes sysindexes WHERE sysindexes.[id] = @ParamObjectID AND sysindexes.[indid] = @ParamStatisticsID'
6802 END
6803
6804 BEGIN TRY
6805 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
6806
6807 IF @CurrentRowCount IS NULL SET @CurrentRowCount = 0
6808 IF @CurrentModificationCounter IS NULL SET @CurrentModificationCounter = 0
6809 END TRY
6810 BEGIN CATCH
6811 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 + CHAR(13) + CHAR(10) + ' '
6812 SET @Severity = CASE WHEN ERROR_NUMBER() IN(1205,1222) THEN @LockMessageSeverity ELSE 16 END
6813 RAISERROR(@ErrorMessage,@Severity,1) WITH NOWAIT
6814
6815 IF NOT (ERROR_NUMBER() IN(1205,1222) AND @LockMessageSeverity = 10)
6816 BEGIN
6817 SET @ReturnCode = ERROR_NUMBER()
6818 END
6819
6820 GOTO NoAction
6821 END CATCH
6822 END
6823
6824 -- Is the index fragmented?
6825 IF @CurrentIndexID IS NOT NULL
6826 AND @CurrentOnReadOnlyFileGroup = 0
6827 AND EXISTS(SELECT * FROM @ActionsPreferred)
6828 AND (EXISTS(SELECT [Priority], [Action], COUNT(*) FROM @ActionsPreferred GROUP BY [Priority], [Action] HAVING COUNT(*) <> 3) OR @MinNumberOfPages > 0 OR @MaxNumberOfPages IS NOT NULL)
6829 BEGIN
6830 SET @CurrentCommand05 = ''
6831
6832 IF @LockTimeout IS NOT NULL SET @CurrentCommand05 = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; '
6833
6834 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'
6835
6836 BEGIN TRY
6837 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
6838 END TRY
6839 BEGIN CATCH
6840 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 + CHAR(13) + CHAR(10) + ' '
6841 SET @Severity = CASE WHEN ERROR_NUMBER() IN(1205,1222) THEN @LockMessageSeverity ELSE 16 END
6842 RAISERROR(@ErrorMessage,@Severity,1) WITH NOWAIT
6843
6844 IF NOT (ERROR_NUMBER() IN(1205,1222) AND @LockMessageSeverity = 10)
6845 BEGIN
6846 SET @ReturnCode = ERROR_NUMBER()
6847 END
6848
6849 GOTO NoAction
6850 END CATCH
6851 END
6852
6853 -- Select fragmentation group
6854 IF @CurrentIndexID IS NOT NULL AND @CurrentOnReadOnlyFileGroup = 0 AND EXISTS(SELECT * FROM @ActionsPreferred)
6855 BEGIN
6856 SET @CurrentFragmentationGroup = CASE
6857 WHEN @CurrentFragmentationLevel >= @FragmentationLevel2 THEN 'High'
6858 WHEN @CurrentFragmentationLevel >= @FragmentationLevel1 AND @CurrentFragmentationLevel < @FragmentationLevel2 THEN 'Medium'
6859 WHEN @CurrentFragmentationLevel < @FragmentationLevel1 THEN 'Low'
6860 END
6861 END
6862
6863 -- Which actions are allowed?
6864 IF @CurrentIndexID IS NOT NULL AND EXISTS(SELECT * FROM @ActionsPreferred)
6865 BEGIN
6866 IF @CurrentOnReadOnlyFileGroup = 0 AND @CurrentIndexType IN (1,2,3,4,5) AND (@CurrentIsMemoryOptimized = 0 OR @CurrentIsMemoryOptimized IS NULL) AND (@CurrentAllowPageLocks = 1 OR @CurrentIndexType = 5)
6867 BEGIN
6868 INSERT INTO @CurrentActionsAllowed ([Action])
6869 VALUES ('INDEX_REORGANIZE')
6870 END
6871 IF @CurrentOnReadOnlyFileGroup = 0 AND @CurrentIndexType IN (1,2,3,4,5) AND (@CurrentIsMemoryOptimized = 0 OR @CurrentIsMemoryOptimized IS NULL)
6872 BEGIN
6873 INSERT INTO @CurrentActionsAllowed ([Action])
6874 VALUES ('INDEX_REBUILD_OFFLINE')
6875 END
6876 IF @CurrentOnReadOnlyFileGroup = 0
6877 AND (@CurrentIsMemoryOptimized = 0 OR @CurrentIsMemoryOptimized IS NULL)
6878 AND (@CurrentIsPartition = 0 OR @Version >= 12)
6879 AND ((@CurrentIndexType = 1 AND @CurrentIsImageText = 0 AND @CurrentIsNewLOB = 0)
6880 OR (@CurrentIndexType = 2 AND @CurrentIsNewLOB = 0)
6881 OR (@CurrentIndexType = 1 AND @CurrentIsImageText = 0 AND @CurrentIsFileStream = 0 AND @Version >= 11)
6882 OR (@CurrentIndexType = 2 AND @Version >= 11))
6883 AND (@CurrentIsColumnStore = 0 OR @Version < 11)
6884 AND SERVERPROPERTY('EngineEdition') IN (3,5,8)
6885 BEGIN
6886 INSERT INTO @CurrentActionsAllowed ([Action])
6887 VALUES ('INDEX_REBUILD_ONLINE')
6888 END
6889 END
6890
6891 -- Decide action
6892 IF @CurrentIndexID IS NOT NULL
6893 AND EXISTS(SELECT * FROM @ActionsPreferred)
6894 AND (@CurrentPageCount >= @MinNumberOfPages OR @MinNumberOfPages = 0)
6895 AND (@CurrentPageCount <= @MaxNumberOfPages OR @MaxNumberOfPages IS NULL)
6896 AND @CurrentResumableIndexOperation = 0
6897 BEGIN
6898 IF EXISTS(SELECT [Priority], [Action], COUNT(*) FROM @ActionsPreferred GROUP BY [Priority], [Action] HAVING COUNT(*) <> 3)
6899 BEGIN
6900 SELECT @CurrentAction = [Action]
6901 FROM @ActionsPreferred
6902 WHERE FragmentationGroup = @CurrentFragmentationGroup
6903 AND [Priority] = (SELECT MIN([Priority])
6904 FROM @ActionsPreferred
6905 WHERE FragmentationGroup = @CurrentFragmentationGroup
6906 AND [Action] IN (SELECT [Action] FROM @CurrentActionsAllowed))
6907 END
6908 ELSE
6909 BEGIN
6910 SELECT @CurrentAction = [Action]
6911 FROM @ActionsPreferred
6912 WHERE [Priority] = (SELECT MIN([Priority])
6913 FROM @ActionsPreferred
6914 WHERE [Action] IN (SELECT [Action] FROM @CurrentActionsAllowed))
6915 END
6916 END
6917
6918 IF @CurrentResumableIndexOperation = 1
6919 BEGIN
6920 SET @CurrentAction = 'INDEX_REBUILD_ONLINE'
6921 END
6922
6923 -- Workaround for limitation in SQL Server, http://support.microsoft.com/kb/2292737
6924 IF @CurrentIndexID IS NOT NULL
6925 BEGIN
6926 SET @CurrentMaxDOP = @MaxDOP
6927
6928 IF @CurrentAction = 'INDEX_REBUILD_ONLINE' AND @CurrentAllowPageLocks = 0
6929 BEGIN
6930 SET @CurrentMaxDOP = 1
6931 END
6932 END
6933
6934 -- Update statistics?
6935 IF @CurrentStatisticsID IS NOT NULL
6936 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))
6937 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))))
6938 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))))
6939 BEGIN
6940 SET @CurrentUpdateStatistics = 'Y'
6941 END
6942 ELSE
6943 BEGIN
6944 SET @CurrentUpdateStatistics = 'N'
6945 END
6946
6947 SET @CurrentStatisticsSample = @StatisticsSample
6948 SET @CurrentStatisticsResample = @StatisticsResample
6949
6950 -- Memory-optimized tables only supports FULLSCAN and RESAMPLE in SQL Server 2014
6951 IF @CurrentIsMemoryOptimized = 1 AND NOT (@Version >= 13 OR SERVERPROPERTY('EngineEdition') IN (5,8)) AND (@CurrentStatisticsSample <> 100 OR @CurrentStatisticsSample IS NULL)
6952 BEGIN
6953 SET @CurrentStatisticsSample = NULL
6954 SET @CurrentStatisticsResample = 'Y'
6955 END
6956
6957 -- Incremental statistics only supports RESAMPLE
6958 IF @PartitionLevelStatistics = 1 AND @CurrentIsIncremental = 1
6959 BEGIN
6960 SET @CurrentStatisticsSample = NULL
6961 SET @CurrentStatisticsResample = 'Y'
6962 END
6963
6964 -- Create index comment
6965 IF @CurrentIndexID IS NOT NULL
6966 BEGIN
6967 SET @CurrentComment06 = 'ObjectType: ' + CASE WHEN @CurrentObjectType = 'U' THEN 'Table' WHEN @CurrentObjectType = 'V' THEN 'View' ELSE 'N/A' END + ', '
6968 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 + ', '
6969 SET @CurrentComment06 = @CurrentComment06 + 'ImageText: ' + CASE WHEN @CurrentIsImageText = 1 THEN 'Yes' WHEN @CurrentIsImageText = 0 THEN 'No' ELSE 'N/A' END + ', '
6970 SET @CurrentComment06 = @CurrentComment06 + 'NewLOB: ' + CASE WHEN @CurrentIsNewLOB = 1 THEN 'Yes' WHEN @CurrentIsNewLOB = 0 THEN 'No' ELSE 'N/A' END + ', '
6971 SET @CurrentComment06 = @CurrentComment06 + 'FileStream: ' + CASE WHEN @CurrentIsFileStream = 1 THEN 'Yes' WHEN @CurrentIsFileStream = 0 THEN 'No' ELSE 'N/A' END + ', '
6972 IF @Version >= 11 SET @CurrentComment06 = @CurrentComment06 + 'ColumnStore: ' + CASE WHEN @CurrentIsColumnStore = 1 THEN 'Yes' WHEN @CurrentIsColumnStore = 0 THEN 'No' ELSE 'N/A' END + ', '
6973 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 + ', '
6974 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 + ', '
6975 SET @CurrentComment06 = @CurrentComment06 + 'AllowPageLocks: ' + CASE WHEN @CurrentAllowPageLocks = 1 THEN 'Yes' WHEN @CurrentAllowPageLocks = 0 THEN 'No' ELSE 'N/A' END + ', '
6976 SET @CurrentComment06 = @CurrentComment06 + 'PageCount: ' + ISNULL(CAST(@CurrentPageCount AS nvarchar),'N/A') + ', '
6977 SET @CurrentComment06 = @CurrentComment06 + 'Fragmentation: ' + ISNULL(CAST(@CurrentFragmentationLevel AS nvarchar),'N/A')
6978 END
6979
6980 IF @CurrentIndexID IS NOT NULL AND (@CurrentPageCount IS NOT NULL OR @CurrentFragmentationLevel IS NOT NULL)
6981 BEGIN
6982 SET @CurrentExtendedInfo06 = (SELECT *
6983 FROM (SELECT CAST(@CurrentPageCount AS nvarchar) AS [PageCount],
6984 CAST(@CurrentFragmentationLevel AS nvarchar) AS Fragmentation
6985 ) ExtendedInfo FOR XML AUTO, ELEMENTS)
6986 END
6987
6988 -- Create statistics comment
6989 IF @CurrentStatisticsID IS NOT NULL
6990 BEGIN
6991 SET @CurrentComment07 = 'ObjectType: ' + CASE WHEN @CurrentObjectType = 'U' THEN 'Table' WHEN @CurrentObjectType = 'V' THEN 'View' ELSE 'N/A' END + ', '
6992 SET @CurrentComment07 = @CurrentComment07 + 'IndexType: ' + CASE WHEN @CurrentIndexID IS NOT NULL THEN 'Index' ELSE 'Column' END + ', '
6993 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 + ', '
6994 SET @CurrentComment07 = @CurrentComment07 + 'Incremental: ' + CASE WHEN @CurrentIsIncremental = 1 THEN 'Y' WHEN @CurrentIsIncremental = 0 THEN 'N' ELSE 'N/A' END + ', '
6995 SET @CurrentComment07 = @CurrentComment07 + 'RowCount: ' + ISNULL(CAST(@CurrentRowCount AS nvarchar),'N/A') + ', '
6996 SET @CurrentComment07 = @CurrentComment07 + 'ModificationCounter: ' + ISNULL(CAST(@CurrentModificationCounter AS nvarchar),'N/A')
6997 END
6998
6999 IF @CurrentStatisticsID IS NOT NULL AND (@CurrentRowCount IS NOT NULL OR @CurrentModificationCounter IS NOT NULL)
7000 BEGIN
7001 SET @CurrentExtendedInfo07 = (SELECT *
7002 FROM (SELECT CAST(@CurrentRowCount AS nvarchar) AS [RowCount],
7003 CAST(@CurrentModificationCounter AS nvarchar) AS ModificationCounter
7004 ) ExtendedInfo FOR XML AUTO, ELEMENTS)
7005 END
7006
7007 IF @CurrentIndexID IS NOT NULL AND @CurrentAction IS NOT NULL AND (GETDATE() < DATEADD(ss,@TimeLimit,@StartTime) OR @TimeLimit IS NULL)
7008 BEGIN
7009 SET @CurrentCommandType06 = 'ALTER_INDEX'
7010
7011 SET @CurrentCommand06 = ''
7012 IF @LockTimeout IS NOT NULL SET @CurrentCommand06 = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; '
7013 SET @CurrentCommand06 = @CurrentCommand06 + 'ALTER INDEX ' + QUOTENAME(@CurrentIndexName) + ' ON ' + QUOTENAME(@CurrentDatabaseName) + '.' + QUOTENAME(@CurrentSchemaName) + '.' + QUOTENAME(@CurrentObjectName)
7014 IF @CurrentResumableIndexOperation = 1 SET @CurrentCommand06 = @CurrentCommand06 + ' RESUME'
7015 IF @CurrentAction IN('INDEX_REBUILD_ONLINE','INDEX_REBUILD_OFFLINE') AND @CurrentResumableIndexOperation = 0 SET @CurrentCommand06 = @CurrentCommand06 + ' REBUILD'
7016 IF @CurrentAction IN('INDEX_REORGANIZE') AND @CurrentResumableIndexOperation = 0 SET @CurrentCommand06 = @CurrentCommand06 + ' REORGANIZE'
7017 IF @CurrentIsPartition = 1 AND @CurrentResumableIndexOperation = 0 SET @CurrentCommand06 = @CurrentCommand06 + ' PARTITION = ' + CAST(@CurrentPartitionNumber AS nvarchar)
7018
7019 IF @CurrentAction IN('INDEX_REBUILD_ONLINE','INDEX_REBUILD_OFFLINE') AND @SortInTempdb = 'Y' AND @CurrentIndexType IN(1,2,3,4) AND @CurrentResumableIndexOperation = 0
7020 BEGIN
7021 INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument)
7022 SELECT 'SORT_IN_TEMPDB = ON'
7023 END
7024
7025 IF @CurrentAction IN('INDEX_REBUILD_ONLINE','INDEX_REBUILD_OFFLINE') AND @SortInTempdb = 'N' AND @CurrentIndexType IN(1,2,3,4) AND @CurrentResumableIndexOperation = 0
7026 BEGIN
7027 INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument)
7028 SELECT 'SORT_IN_TEMPDB = OFF'
7029 END
7030
7031 IF @CurrentAction = 'INDEX_REBUILD_ONLINE' AND (@CurrentIsPartition = 0 OR @Version >= 12) AND @CurrentResumableIndexOperation = 0
7032 BEGIN
7033 INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument)
7034 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
7035 END
7036
7037 IF @CurrentAction = 'INDEX_REBUILD_OFFLINE' AND (@CurrentIsPartition = 0 OR @Version >= 12) AND @CurrentResumableIndexOperation = 0
7038 BEGIN
7039 INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument)
7040 SELECT 'ONLINE = OFF'
7041 END
7042
7043 IF @CurrentAction IN('INDEX_REBUILD_ONLINE','INDEX_REBUILD_OFFLINE') AND @CurrentMaxDOP IS NOT NULL
7044 BEGIN
7045 INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument)
7046 SELECT 'MAXDOP = ' + CAST(@CurrentMaxDOP AS nvarchar)
7047 END
7048
7049 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
7050 BEGIN
7051 INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument)
7052 SELECT 'FILLFACTOR = ' + CAST(@FillFactor AS nvarchar)
7053 END
7054
7055 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
7056 BEGIN
7057 INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument)
7058 SELECT 'PAD_INDEX = ON'
7059 END
7060
7061 IF (@Version >= 14 OR SERVERPROPERTY('EngineEdition') IN (5,8)) AND @CurrentAction = 'INDEX_REBUILD_ONLINE' AND @CurrentResumableIndexOperation = 0
7062 BEGIN
7063 INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument)
7064 SELECT CASE WHEN @Resumable = 'Y' AND @CurrentIndexType IN(1,2) AND @CurrentIsComputed = 0 AND @CurrentIsTimestamp = 0 THEN 'RESUMABLE = ON' ELSE 'RESUMABLE = OFF' END
7065 END
7066
7067 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
7068 BEGIN
7069 INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument)
7070 SELECT 'MAX_DURATION = ' + CAST(DATEDIFF(MINUTE,GETDATE(),DATEADD(ss,@TimeLimit,@StartTime)) AS nvarchar(max))
7071 END
7072
7073 IF @CurrentAction IN('INDEX_REORGANIZE') AND @LOBCompaction = 'Y'
7074 BEGIN
7075 INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument)
7076 SELECT 'LOB_COMPACTION = ON'
7077 END
7078
7079 IF @CurrentAction IN('INDEX_REORGANIZE') AND @LOBCompaction = 'N'
7080 BEGIN
7081 INSERT INTO @CurrentAlterIndexWithClauseArguments (Argument)
7082 SELECT 'LOB_COMPACTION = OFF'
7083 END
7084
7085 IF EXISTS (SELECT * FROM @CurrentAlterIndexWithClauseArguments)
7086 BEGIN
7087 SET @CurrentAlterIndexWithClause = ' WITH ('
7088 END
7089
7090 SELECT @CurrentAlterIndexWithClause = @CurrentAlterIndexWithClause + Argument + ', '
7091 FROM @CurrentAlterIndexWithClauseArguments
7092 ORDER BY ID ASC
7093
7094 SET @CurrentAlterIndexWithClause = LEFT(@CurrentAlterIndexWithClause,LEN(@CurrentAlterIndexWithClause) - 1)
7095
7096 IF EXISTS (SELECT * FROM @CurrentAlterIndexWithClauseArguments)
7097 BEGIN
7098 SET @CurrentAlterIndexWithClause = @CurrentAlterIndexWithClause + ')'
7099 END
7100
7101 IF @CurrentAlterIndexWithClause IS NOT NULL SET @CurrentCommand06 = @CurrentCommand06 + @CurrentAlterIndexWithClause
7102
7103 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
7104 SET @Error = @@ERROR
7105 IF @Error <> 0 SET @CurrentCommandOutput06 = @Error
7106 IF @CurrentCommandOutput06 <> 0 SET @ReturnCode = @CurrentCommandOutput06
7107
7108 IF @Delay > 0
7109 BEGIN
7110 SET @CurrentDelay = DATEADD(ss,@Delay,'1900-01-01')
7111 WAITFOR DELAY @CurrentDelay
7112 END
7113 END
7114
7115 SET @CurrentMaxDOP = @MaxDOP
7116
7117 IF @CurrentStatisticsID IS NOT NULL AND @CurrentUpdateStatistics = 'Y' AND (GETDATE() < DATEADD(ss,@TimeLimit,@StartTime) OR @TimeLimit IS NULL)
7118 BEGIN
7119 SET @CurrentCommandType07 = 'UPDATE_STATISTICS'
7120
7121 SET @CurrentCommand07 = ''
7122 IF @LockTimeout IS NOT NULL SET @CurrentCommand07 = 'SET LOCK_TIMEOUT ' + CAST(@LockTimeout * 1000 AS nvarchar) + '; '
7123 SET @CurrentCommand07 = @CurrentCommand07 + 'UPDATE STATISTICS ' + QUOTENAME(@CurrentDatabaseName) + '.' + QUOTENAME(@CurrentSchemaName) + '.' + QUOTENAME(@CurrentObjectName) + ' ' + QUOTENAME(@CurrentStatisticsName)
7124
7125 IF @CurrentMaxDOP IS NOT NULL AND ((@Version >= 13.05026 AND @Version < 14) OR @Version >= 14.030154)
7126 BEGIN
7127 INSERT INTO @CurrentUpdateStatisticsWithClauseArguments (Argument)
7128 SELECT 'MAXDOP = ' + CAST(@CurrentMaxDOP AS nvarchar)
7129 END
7130
7131 IF @CurrentStatisticsSample = 100
7132 BEGIN
7133 INSERT INTO @CurrentUpdateStatisticsWithClauseArguments (Argument)
7134 SELECT 'FULLSCAN'
7135 END
7136
7137 IF @CurrentStatisticsSample IS NOT NULL AND @CurrentStatisticsSample <> 100
7138 BEGIN
7139 INSERT INTO @CurrentUpdateStatisticsWithClauseArguments (Argument)
7140 SELECT 'SAMPLE ' + CAST(@CurrentStatisticsSample AS nvarchar) + ' PERCENT'
7141 END
7142
7143 IF @CurrentStatisticsResample = 'Y'
7144 BEGIN
7145 INSERT INTO @CurrentUpdateStatisticsWithClauseArguments (Argument)
7146 SELECT 'RESAMPLE'
7147 END
7148
7149 IF @CurrentNoRecompute = 1
7150 BEGIN
7151 INSERT INTO @CurrentUpdateStatisticsWithClauseArguments (Argument)
7152 SELECT 'NORECOMPUTE'
7153 END
7154
7155 IF EXISTS (SELECT * FROM @CurrentUpdateStatisticsWithClauseArguments)
7156 BEGIN
7157 SET @CurrentUpdateStatisticsWithClause = ' WITH'
7158
7159 SELECT @CurrentUpdateStatisticsWithClause = @CurrentUpdateStatisticsWithClause + ' ' + Argument + ','
7160 FROM @CurrentUpdateStatisticsWithClauseArguments
7161 ORDER BY ID ASC
7162
7163 SET @CurrentUpdateStatisticsWithClause = LEFT(@CurrentUpdateStatisticsWithClause,LEN(@CurrentUpdateStatisticsWithClause) - 1)
7164 END
7165
7166 IF @CurrentUpdateStatisticsWithClause IS NOT NULL SET @CurrentCommand07 = @CurrentCommand07 + @CurrentUpdateStatisticsWithClause
7167
7168 IF @PartitionLevelStatistics = 1 AND @CurrentIsIncremental = 1 AND @CurrentPartitionNumber IS NOT NULL SET @CurrentCommand07 = @CurrentCommand07 + ' ON PARTITIONS(' + CAST(@CurrentPartitionNumber AS nvarchar(max)) + ')'
7169
7170 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
7171 SET @Error = @@ERROR
7172 IF @Error <> 0 SET @CurrentCommandOutput07 = @Error
7173 IF @CurrentCommandOutput07 <> 0 SET @ReturnCode = @CurrentCommandOutput07
7174 END
7175
7176 NoAction:
7177
7178 -- Update that the index or statistics is completed
7179 UPDATE @tmpIndexesStatistics
7180 SET Completed = 1
7181 WHERE Selected = 1
7182 AND Completed = 0
7183 AND ID = @CurrentIxID
7184
7185 -- Clear variables
7186 SET @CurrentCommand02 = NULL
7187 SET @CurrentCommand03 = NULL
7188 SET @CurrentCommand04 = NULL
7189 SET @CurrentCommand05 = NULL
7190 SET @CurrentCommand06 = NULL
7191 SET @CurrentCommand07 = NULL
7192
7193 SET @CurrentCommandOutput06 = NULL
7194 SET @CurrentCommandOutput07 = NULL
7195
7196 SET @CurrentCommandType06 = NULL
7197 SET @CurrentCommandType07 = NULL
7198
7199 SET @CurrentComment06 = NULL
7200 SET @CurrentComment07 = NULL
7201
7202 SET @CurrentExtendedInfo06 = NULL
7203 SET @CurrentExtendedInfo07 = NULL
7204
7205 SET @CurrentIxID = NULL
7206 SET @CurrentSchemaID = NULL
7207 SET @CurrentSchemaName = NULL
7208 SET @CurrentObjectID = NULL
7209 SET @CurrentObjectName = NULL
7210 SET @CurrentObjectType = NULL
7211 SET @CurrentIsMemoryOptimized = NULL
7212 SET @CurrentIndexID = NULL
7213 SET @CurrentIndexName = NULL
7214 SET @CurrentIndexType = NULL
7215 SET @CurrentStatisticsID = NULL
7216 SET @CurrentStatisticsName = NULL
7217 SET @CurrentPartitionID = NULL
7218 SET @CurrentPartitionNumber = NULL
7219 SET @CurrentPartitionCount = NULL
7220 SET @CurrentIsPartition = NULL
7221 SET @CurrentIndexExists = NULL
7222 SET @CurrentStatisticsExists = NULL
7223 SET @CurrentIsImageText = NULL
7224 SET @CurrentIsNewLOB = NULL
7225 SET @CurrentIsFileStream = NULL
7226 SET @CurrentIsColumnStore = NULL
7227 SET @CurrentIsComputed = NULL
7228 SET @CurrentIsTimestamp = NULL
7229 SET @CurrentAllowPageLocks = NULL
7230 SET @CurrentNoRecompute = NULL
7231 SET @CurrentIsIncremental = NULL
7232 SET @CurrentRowCount = NULL
7233 SET @CurrentModificationCounter = NULL
7234 SET @CurrentOnReadOnlyFileGroup = NULL
7235 SET @CurrentResumableIndexOperation = NULL
7236 SET @CurrentFragmentationLevel = NULL
7237 SET @CurrentPageCount = NULL
7238 SET @CurrentFragmentationGroup = NULL
7239 SET @CurrentAction = NULL
7240 SET @CurrentMaxDOP = NULL
7241 SET @CurrentUpdateStatistics = NULL
7242 SET @CurrentStatisticsSample = NULL
7243 SET @CurrentStatisticsResample = NULL
7244 SET @CurrentAlterIndexWithClause = NULL
7245 SET @CurrentUpdateStatisticsWithClause = NULL
7246
7247 DELETE FROM @CurrentActionsAllowed
7248 DELETE FROM @CurrentAlterIndexWithClauseArguments
7249 DELETE FROM @CurrentUpdateStatisticsWithClauseArguments
7250
7251 END
7252
7253 END
7254
7255 IF DATABASEPROPERTYEX(@CurrentDatabaseName,'Status') = 'SUSPECT'
7256 BEGIN
7257 SET @ErrorMessage = 'The database ' + QUOTENAME(@CurrentDatabaseName) + ' is in a SUSPECT state.' + CHAR(13) + CHAR(10) + ' '
7258 RAISERROR(@ErrorMessage,16,1) WITH NOWAIT
7259 SET @Error = @@ERROR
7260 END
7261
7262 -- Update that the database is completed
7263 IF @DatabasesInParallel = 'Y'
7264 BEGIN
7265 UPDATE dbo.QueueDatabase
7266 SET DatabaseEndTime = GETDATE()
7267 WHERE QueueID = @QueueID
7268 AND DatabaseName = @CurrentDatabaseName
7269 END
7270 ELSE
7271 BEGIN
7272 UPDATE @tmpDatabases
7273 SET Completed = 1
7274 WHERE Selected = 1
7275 AND Completed = 0
7276 AND ID = @CurrentDBID
7277 END
7278
7279 -- Clear variables
7280 SET @CurrentDBID = NULL
7281 SET @CurrentDatabaseID = NULL
7282 SET @CurrentDatabaseName = NULL
7283 SET @CurrentIsDatabaseAccessible = NULL
7284 SET @CurrentAvailabilityGroup = NULL
7285 SET @CurrentAvailabilityGroupRole = NULL
7286 SET @CurrentDatabaseMirroringRole = NULL
7287 SET @CurrentIsReadOnly = NULL
7288
7289 SET @CurrentCommand01 = NULL
7290
7291 DELETE FROM @tmpIndexesStatistics
7292
7293 END
7294
7295 ----------------------------------------------------------------------------------------------------
7296 --// Log completing information //--
7297 ----------------------------------------------------------------------------------------------------
7298
7299 Logging:
7300 SET @EndMessage = 'Date and time: ' + CONVERT(nvarchar,GETDATE(),120)
7301 SET @EndMessage = REPLACE(@EndMessage,'%','%%')
7302 RAISERROR(@EndMessage,10,1) WITH NOWAIT
7303
7304 IF @ReturnCode <> 0
7305 BEGIN
7306 RETURN @ReturnCode
7307 END
7308
7309 ----------------------------------------------------------------------------------------------------
7310
7311END
7312
7313GO
7314IF (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
7315BEGIN
7316
7317 DECLARE @BackupDirectory nvarchar(max)
7318 DECLARE @CleanupTime int
7319 DECLARE @OutputFileDirectory nvarchar(max)
7320 DECLARE @LogToTable nvarchar(max)
7321 DECLARE @DatabaseName nvarchar(max)
7322
7323 DECLARE @Version numeric(18,10)
7324 DECLARE @HostPlatform nvarchar(max)
7325 DECLARE @AmazonRDS bit
7326 DECLARE @DirectorySeparator nvarchar(max)
7327 DECLARE @LogDirectory nvarchar(max)
7328
7329 DECLARE @TokenServer nvarchar(max)
7330 DECLARE @TokenJobID nvarchar(max)
7331 DECLARE @TokenStepID nvarchar(max)
7332 DECLARE @TokenDate nvarchar(max)
7333 DECLARE @TokenTime nvarchar(max)
7334 DECLARE @TokenLogDirectory nvarchar(max)
7335
7336 DECLARE @JobDescription nvarchar(max)
7337 DECLARE @JobCategory nvarchar(max)
7338 DECLARE @JobOwner nvarchar(max)
7339
7340 DECLARE @Jobs TABLE (JobID int IDENTITY,
7341 [Name] nvarchar(max),
7342 CommandTSQL nvarchar(max),
7343 CommandCmdExec nvarchar(max),
7344 DatabaseName varchar(max),
7345 OutputFileNamePart01 nvarchar(max),
7346 OutputFileNamePart02 nvarchar(max),
7347 Selected bit DEFAULT 0,
7348 Completed bit DEFAULT 0)
7349
7350 DECLARE @CurrentJobID int
7351 DECLARE @CurrentJobName nvarchar(max)
7352 DECLARE @CurrentCommandTSQL nvarchar(max)
7353 DECLARE @CurrentCommandCmdExec nvarchar(max)
7354 DECLARE @CurrentDatabaseName nvarchar(max)
7355 DECLARE @CurrentOutputFileNamePart01 nvarchar(max)
7356 DECLARE @CurrentOutputFileNamePart02 nvarchar(max)
7357
7358 DECLARE @CurrentJobStepCommand nvarchar(max)
7359 DECLARE @CurrentJobStepSubSystem nvarchar(max)
7360 DECLARE @CurrentJobStepDatabaseName nvarchar(max)
7361 DECLARE @CurrentOutputFileName nvarchar(max)
7362
7363 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))
7364
7365 SET @AmazonRDS = CASE WHEN DB_ID('rdsadmin') IS NOT NULL AND SUSER_SNAME(0x01) = 'rdsa' THEN 1 ELSE 0 END
7366
7367 IF @Version >= 14
7368 BEGIN
7369 SELECT @HostPlatform = host_platform
7370 FROM sys.dm_os_host_info
7371 END
7372 ELSE
7373 BEGIN
7374 SET @HostPlatform = 'Windows'
7375 END
7376
7377 SELECT @DirectorySeparator = CASE
7378 WHEN @HostPlatform = 'Windows' THEN '\'
7379 WHEN @HostPlatform = 'Linux' THEN '/'
7380 END
7381
7382 IF @Version >= 9.002047
7383 BEGIN
7384 SET @TokenServer = '$' + '(ESCAPE_SQUOTE(SRVR))'
7385 SET @TokenJobID = '$' + '(ESCAPE_SQUOTE(JOBID))'
7386 SET @TokenStepID = '$' + '(ESCAPE_SQUOTE(STEPID))'
7387 SET @TokenDate = '$' + '(ESCAPE_SQUOTE(STRTDT))'
7388 SET @TokenTime = '$' + '(ESCAPE_SQUOTE(STRTTM))'
7389 END
7390 ELSE
7391 BEGIN
7392 SET @TokenServer = '$' + '(SRVR)'
7393 SET @TokenJobID = '$' + '(JOBID)'
7394 SET @TokenStepID = '$' + '(STEPID)'
7395 SET @TokenDate = '$' + '(STRTDT)'
7396 SET @TokenTime = '$' + '(STRTTM)'
7397 END
7398
7399 IF @Version >= 12 AND @HostPlatform = 'Windows'
7400 BEGIN
7401 SET @TokenLogDirectory = '$' + '(ESCAPE_SQUOTE(SQLLOGDIR))'
7402 END
7403
7404 SELECT @BackupDirectory = Value
7405 FROM #Config
7406 WHERE [Name] = 'BackupDirectory'
7407
7408 IF @HostPlatform = 'Windows'
7409 BEGIN
7410 SELECT @CleanupTime = Value
7411 FROM #Config
7412 WHERE [Name] = 'CleanupTime'
7413 END
7414
7415 SELECT @OutputFileDirectory = Value
7416 FROM #Config
7417 WHERE [Name] = 'OutputFileDirectory'
7418
7419 SELECT @LogToTable = Value
7420 FROM #Config
7421 WHERE [Name] = 'LogToTable'
7422
7423 SELECT @DatabaseName = Value
7424 FROM #Config
7425 WHERE [Name] = 'DatabaseName'
7426
7427 IF @Version >= 11
7428 BEGIN
7429 SELECT @LogDirectory = [path]
7430 FROM sys.dm_os_server_diagnostics_log_configurations
7431 END
7432 ELSE
7433 BEGIN
7434 SELECT @LogDirectory = LEFT(CAST(SERVERPROPERTY('ErrorLogFileName') AS nvarchar(max)),LEN(CAST(SERVERPROPERTY('ErrorLogFileName') AS nvarchar(max))) - CHARINDEX('\',REVERSE(CAST(SERVERPROPERTY('ErrorLogFileName') AS nvarchar(max)))))
7435 END
7436
7437 IF @OutputFileDirectory IS NOT NULL AND RIGHT(@OutputFileDirectory,1) = @DirectorySeparator
7438 BEGIN
7439 SET @OutputFileDirectory = LEFT(@OutputFileDirectory, LEN(@OutputFileDirectory) - 1)
7440 END
7441
7442 IF @LogDirectory IS NOT NULL AND RIGHT(@LogDirectory,1) = @DirectorySeparator
7443 BEGIN
7444 SET @LogDirectory = LEFT(@LogDirectory, LEN(@LogDirectory) - 1)
7445 END
7446
7447 SET @JobDescription = 'Source: https://FixSQL.co.uk'
7448 SET @JobCategory = 'Database Maintenance'
7449
7450 IF @AmazonRDS = 0
7451 BEGIN
7452 SET @JobOwner = SUSER_SNAME(0x01)
7453 END
7454
7455 INSERT INTO @Jobs ([Name], CommandTSQL, DatabaseName, OutputFileNamePart01, OutputFileNamePart02)
7456 SELECT 'DatabaseBackup - SYSTEM_DATABASES - FULL',
7457 '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 + '''',
7458 @DatabaseName,
7459 'DatabaseBackup',
7460 'FULL'
7461
7462 INSERT INTO @Jobs ([Name], CommandTSQL, DatabaseName, OutputFileNamePart01, OutputFileNamePart02)
7463 SELECT 'DatabaseBackup - USER_DATABASES - DIFF',
7464 '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 + '''',
7465 @DatabaseName,
7466 'DatabaseBackup',
7467 'DIFF'
7468
7469 INSERT INTO @Jobs ([Name], CommandTSQL, DatabaseName, OutputFileNamePart01, OutputFileNamePart02)
7470 SELECT 'DatabaseBackup - USER_DATABASES - FULL',
7471 '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 + '''',
7472 @DatabaseName,
7473 'DatabaseBackup',
7474 'FULL'
7475
7476 INSERT INTO @Jobs ([Name], CommandTSQL, DatabaseName, OutputFileNamePart01, OutputFileNamePart02)
7477 SELECT 'DatabaseBackup - USER_DATABASES - LOG',
7478 '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 + '''',
7479 @DatabaseName,
7480 'DatabaseBackup',
7481 'LOG'
7482
7483 INSERT INTO @Jobs ([Name], CommandTSQL, DatabaseName, OutputFileNamePart01)
7484 SELECT 'DatabaseIntegrityCheck - SYSTEM_DATABASES',
7485 'EXECUTE [dbo].[DatabaseIntegrityCheck]' + CHAR(13) + CHAR(10) + '@Databases = ''SYSTEM_DATABASES'',' + CHAR(13) + CHAR(10) + '@LogToTable = ''' + @LogToTable + '''',
7486 @DatabaseName,
7487 'DatabaseIntegrityCheck'
7488
7489 INSERT INTO @Jobs ([Name], CommandTSQL, DatabaseName, OutputFileNamePart01)
7490 SELECT 'DatabaseIntegrityCheck - USER_DATABASES',
7491 'EXECUTE [dbo].[DatabaseIntegrityCheck]' + CHAR(13) + CHAR(10) + '@Databases = ''USER_DATABASES' + CASE WHEN @AmazonRDS = 1 THEN ', -rdsadmin' ELSE '' END + ''',' + CHAR(13) + CHAR(10) + '@LogToTable = ''' + @LogToTable + '''',
7492 @DatabaseName,
7493 'DatabaseIntegrityCheck'
7494
7495 INSERT INTO @Jobs ([Name], CommandTSQL, DatabaseName, OutputFileNamePart01)
7496 SELECT 'IndexOptimize - USER_DATABASES',
7497 'EXECUTE [dbo].[IndexOptimize]' + CHAR(13) + CHAR(10) + '@Databases = ''USER_DATABASES'',' + CHAR(13) + CHAR(10) + '@LogToTable = ''' + @LogToTable + '''',
7498 @DatabaseName,
7499 'IndexOptimize'
7500
7501 INSERT INTO @Jobs ([Name], CommandTSQL, DatabaseName, OutputFileNamePart01)
7502 SELECT 'sp_delete_backuphistory',
7503 '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',
7504 'msdb',
7505 'sp_delete_backuphistory'
7506
7507 INSERT INTO @Jobs ([Name], CommandTSQL, DatabaseName, OutputFileNamePart01)
7508 SELECT 'sp_purge_jobhistory',
7509 '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',
7510 'msdb',
7511 'sp_purge_jobhistory'
7512
7513 INSERT INTO @Jobs ([Name], CommandTSQL, DatabaseName, OutputFileNamePart01)
7514 SELECT 'CommandLog Cleanup',
7515 'DELETE FROM [dbo].[CommandLog]' + CHAR(13) + CHAR(10) + 'WHERE StartTime < DATEADD(dd,-30,GETDATE())',
7516 @DatabaseName,
7517 'CommandLogCleanup'
7518
7519 INSERT INTO @Jobs ([Name], CommandCmdExec, OutputFileNamePart01)
7520 SELECT 'Output File Cleanup',
7521 '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"',
7522 'OutputFileCleanup'
7523
7524 IF @AmazonRDS = 1
7525 BEGIN
7526 UPDATE @Jobs
7527 SET Selected = 1
7528 WHERE [Name] IN('DatabaseIntegrityCheck - USER_DATABASES','IndexOptimize - USER_DATABASES','CommandLog Cleanup')
7529 END
7530 ELSE IF SERVERPROPERTY('EngineEdition') = 8
7531 BEGIN
7532 UPDATE @Jobs
7533 SET Selected = 1
7534 WHERE [Name] IN('DatabaseIntegrityCheck - SYSTEM_DATABASES','DatabaseIntegrityCheck - USER_DATABASES','IndexOptimize - USER_DATABASES','CommandLog Cleanup','sp_delete_backuphistory','sp_purge_jobhistory')
7535 END
7536 ELSE IF @HostPlatform = 'Windows'
7537 BEGIN
7538 UPDATE @Jobs
7539 SET Selected = 1
7540 END
7541 ELSE IF @HostPlatform = 'Linux'
7542 BEGIN
7543 UPDATE @Jobs
7544 SET Selected = 1
7545 WHERE CommandTSQL IS NOT NULL
7546 END
7547
7548 WHILE EXISTS (SELECT * FROM @Jobs WHERE Completed = 0 AND Selected = 1)
7549 BEGIN
7550 SELECT @CurrentJobID = JobID,
7551 @CurrentJobName = [Name],
7552 @CurrentCommandTSQL = CommandTSQL,
7553 @CurrentCommandCmdExec = CommandCmdExec,
7554 @CurrentDatabaseName = DatabaseName,
7555 @CurrentOutputFileNamePart01 = OutputFileNamePart01,
7556 @CurrentOutputFileNamePart02 = OutputFileNamePart02
7557 FROM @Jobs
7558 WHERE Completed = 0
7559 AND Selected = 1
7560 ORDER BY JobID ASC
7561
7562 IF @CurrentCommandTSQL IS NOT NULL AND @AmazonRDS = 1
7563 BEGIN
7564 SET @CurrentJobStepSubSystem = 'TSQL'
7565 SET @CurrentJobStepCommand = @CurrentCommandTSQL
7566 SET @CurrentJobStepDatabaseName = @CurrentDatabaseName
7567 END
7568 ELSE IF @CurrentCommandTSQL IS NOT NULL AND SERVERPROPERTY('EngineEdition') = 8
7569 BEGIN
7570 SET @CurrentJobStepSubSystem = 'TSQL'
7571 SET @CurrentJobStepCommand = @CurrentCommandTSQL
7572 SET @CurrentJobStepDatabaseName = @CurrentDatabaseName
7573 END
7574 ELSE IF @CurrentCommandTSQL IS NOT NULL AND @HostPlatform = 'Linux'
7575 BEGIN
7576 SET @CurrentJobStepSubSystem = 'TSQL'
7577 SET @CurrentJobStepCommand = @CurrentCommandTSQL
7578 SET @CurrentJobStepDatabaseName = @CurrentDatabaseName
7579 END
7580 ELSE IF @CurrentCommandTSQL IS NOT NULL AND @HostPlatform = 'Windows' AND @Version >= 11
7581 BEGIN
7582 SET @CurrentJobStepSubSystem = 'TSQL'
7583 SET @CurrentJobStepCommand = @CurrentCommandTSQL
7584 SET @CurrentJobStepDatabaseName = @CurrentDatabaseName
7585 END
7586 ELSE IF @CurrentCommandTSQL IS NOT NULL AND @HostPlatform = 'Windows' AND @Version < 11
7587 BEGIN
7588 SET @CurrentJobStepSubSystem = 'CMDEXEC'
7589 SET @CurrentJobStepCommand = 'sqlcmd -E -S ' + @TokenServer + ' -d ' + @CurrentDatabaseName + ' -Q "' + REPLACE(@CurrentCommandTSQL,(CHAR(13) + CHAR(10)),' ') + '" -b'
7590 SET @CurrentJobStepDatabaseName = NULL
7591 END
7592 ELSE IF @CurrentCommandCmdExec IS NOT NULL AND @HostPlatform = 'Windows'
7593 BEGIN
7594 SET @CurrentJobStepSubSystem = 'CMDEXEC'
7595 SET @CurrentJobStepCommand = @CurrentCommandCmdExec
7596 SET @CurrentJobStepDatabaseName = NULL
7597 END
7598
7599 IF @AmazonRDS = 0 AND SERVERPROPERTY('EngineEdition') <> 8
7600 BEGIN
7601 SET @CurrentOutputFileName = COALESCE(@OutputFileDirectory,@TokenLogDirectory,@LogDirectory) + @DirectorySeparator + ISNULL(@CurrentOutputFileNamePart01 + '_','') + ISNULL(@CurrentOutputFileNamePart02 + '_','') + @TokenJobID + '_' + @TokenStepID + '_' + @TokenDate + '_' + @TokenTime + '.txt'
7602 IF LEN(@CurrentOutputFileName) > 200 SET @CurrentOutputFileName = COALESCE(@OutputFileDirectory,@TokenLogDirectory,@LogDirectory) + @DirectorySeparator + ISNULL(@CurrentOutputFileNamePart01 + '_','') + @TokenJobID + '_' + @TokenStepID + '_' + @TokenDate + '_' + @TokenTime + '.txt'
7603 IF LEN(@CurrentOutputFileName) > 200 SET @CurrentOutputFileName = COALESCE(@OutputFileDirectory,@TokenLogDirectory,@LogDirectory) + @DirectorySeparator + @TokenJobID + '_' + @TokenStepID + '_' + @TokenDate + '_' + @TokenTime + '.txt'
7604 IF LEN(@CurrentOutputFileName) > 200 SET @CurrentOutputFileName = NULL
7605 END
7606
7607 IF @CurrentJobStepSubSystem IS NOT NULL AND @CurrentJobStepCommand IS NOT NULL AND NOT EXISTS (SELECT * FROM msdb.dbo.sysjobs WHERE [name] = @CurrentJobName)
7608 BEGIN
7609 EXECUTE msdb.dbo.sp_add_job @job_name = @CurrentJobName, @description = @JobDescription, @category_name = @JobCategory, @owner_login_name = @JobOwner
7610 EXECUTE msdb.dbo.sp_add_jobstep @job_name = @CurrentJobName, @step_name = @CurrentJobName, @subsystem = @CurrentJobStepSubSystem, @command = @CurrentJobStepCommand, @output_file_name = @CurrentOutputFileName, @database_name = @CurrentJobStepDatabaseName
7611 EXECUTE msdb.dbo.sp_add_jobserver @job_name = @CurrentJobName
7612 END
7613
7614 UPDATE Jobs
7615 SET Completed = 1
7616 FROM @Jobs Jobs
7617 WHERE JobID = @CurrentJobID
7618
7619 SET @CurrentJobID = NULL
7620 SET @CurrentJobName = NULL
7621 SET @CurrentCommandTSQL = NULL
7622 SET @CurrentCommandCmdExec = NULL
7623 SET @CurrentDatabaseName = NULL
7624 SET @CurrentOutputFileNamePart01 = NULL
7625 SET @CurrentOutputFileNamePart02 = NULL
7626 SET @CurrentJobStepCommand = NULL
7627 SET @CurrentJobStepSubSystem = NULL
7628 SET @CurrentJobStepDatabaseName = NULL
7629 SET @CurrentOutputFileName = NULL
7630
7631 END
7632
7633END
7634GO