Generate Script for Autogrowth Settings

The below code generates tsql sripts that can be used to change file growth settings in a sql server instance.

Info
  • Databases < 10GB Growth rate between 10MB and 128MB Data
  • Databases < 10GB Growth rate between 10 MB and 128MB Log
  • Databases < 30GB Growth rate between 128 MB and 512MB Data
  • Databases < 30GB Growth rate between 128MB and 512MB Log
  • Databases > 30GB Growth rate 512 MB Log if ver >= 2014
  • Databases > 30GB Growth rate 8192 MB Log if ver < 2014
  • Databases > 30GB Growth in MB but number individual for data
  • All files should have unlimited growth rate

Show current file settings


-- View current file growth settings.
select 
	DB_NAME(mf.database_id) database_name, 
	mf.name logical_name, 
	size/ 128 [file_size_MB], 
	CASE mf.is_percent_growth WHEN 1 THEN 'Yes' ELSE 'No' END AS [is_percent_growth], 
	CASE mf.is_percent_growth 
		WHEN 1 THEN CONVERT(VARCHAR, mf.growth) + '%'
		WHEN 0 THEN CONVERT(VARCHAR, mf.growth / 128) + ' MB'
		END AS [growth_in_increment_of], 
	CASE mf.max_size
		WHEN 0 THEN 'No growth is allowed'
		WHEN -1 THEN 'Unlimited'
		WHEN 268435456 THEN 'Unlimited'
		ELSE CONVERT(VARCHAR, mf.max_size) END AS [max_size], 
	physical_name 
from 
	sys.master_files mf 

Generate code for setting file sizes


-- Generate change scripts
;with Db_Sizes AS (
SELECT      
	d.name,  
	SUM(size) / 128 AS [Total disk space (MB)],
	CASE 
		WHEN SUM(mf.size) / 128 < 10240 THEN 'S'
		WHEN SUM(mf.size) / 128 BETWEEN 10240 AND 30720 THEN 'M'
		ELSE 'L' END AS Size
FROM        
	sys.databases d   
	JOIN sys.master_files mf ON d.database_id=mf.database_id  
GROUP BY    
	d.name  
), NewFileSize AS (
SELECT
	d.[name] As DBName,
	mf.[name] AS LogicalName,
	mf.type_desc AS FileType,
	CASE 
		WHEN d.[Size] = 'S' Then '64MB'
		WHEN d.[Size] = 'M' Then '256MB'
		ELSE '1024MB' END AS DataGrowth,
	CASE 
		WHEN d.[Size] = 'S' Then '64MB'
		WHEN d.[Size] = 'M' Then '256MB'
		ELSE '512MB' END AS LogGrowth,
	d.Size,
	CASE 
		WHEN mf.is_percent_growth = 1 THEN 1
		WHEN d.[Size] = 'S' AND mf.growth/128 NOT BETWEEN 10 AND 128 THEN 1
		WHEN d.[Size] = 'M' AND mf.growth/128 NOT BETWEEN 128 AND 512 THEN 1
		WHEN d.[Size] = 'L' AND mf.growth/128 < 512 THEN 1
		ELSE 0 END AS ChangeIndicator,
	mf.growth/128 AS Growth_mb,
	mf.is_percent_growth
FROM
	sys.master_files mf 
	INNER JOIN Db_Sizes d ON d.[name] = DB_NAME(mf.database_id)
WHERE
	CASE 
		WHEN mf.is_percent_growth = 1 THEN 1
		WHEN d.[Size] = 'S' AND mf.growth/128 NOT BETWEEN 10 AND 128 THEN 1
		WHEN d.[Size] = 'M' AND mf.growth/128 NOT BETWEEN 128 AND 512 THEN 1
		WHEN d.[Size] = 'L' AND mf.growth/128 < 512 THEN 1
		ELSE 0 END = 1 
)
select 
	CASE WHEN nfs.FileType like 'LOG' 
		THEN 'ALTER DATABASE [' + nfs.DBName + '] MODIFY FILE (NAME = [' + nfs.LogicalName + '], FILEGROWTH = ' + nfs.LogGrowth + ')'
		ELSE 'ALTER DATABASE [' + nfs.DBName + '] MODIFY FILE (NAME = [' + nfs.LogicalName + '], FILEGROWTH = ' + nfs.DataGrowth + ')'
		END as ChangeAutoGrowSettings, 
	nfs.DBName,
	nfs.LogicalName,
	nfs.Size
from 
  NewFileSize nfs

Generate code for max file setting.


-- Generate change scripts
select 
	mf.[name], 
	mf.max_size,
	'ALTER DATABASE [' + DB_NAME(mf.database_id)+ '] MODIFY FILE (NAME = [' + mf.[name] + '], MAXSIZE = UNLIMITED)'
from 
	sys.master_files mf
WHERE
	mf.max_size BETWEEN 0 AND 268435455 --Unlimited = -1, 268435456 is max file setting for a log file.