In addition to creating backups, there are a variety of tasks and functions SQL Server makes available which can both improve the performance and reliability of your databases. We have previously showed you how to backup SQL Server databases with a simple command line script so in the same fashion we are providing a script which will allow you to easily perform common maintenance tasks. Compacting/Shrinking a Database [/Compact] There are several factors which contribute to the physical disk space a SQL Server database uses. Just to name a few:

Compacting (or shrinking) the database will reclaim unused disk space. For small databases (200 MB or less) this usually will not be very much, but for large databases (1 GB or more) the reclaimed space may be significant. Reindexing a Database [/Reindex] Much like constantly creating, editing and deleting files can lead to disk fragmentation, inserting, updating and deleting records in a database can lead to table fragmentation. The practical results are the same in that read and write operations suffer a performance hit. While not a perfect analogy, reindexing the tables in a database essentially defragments them. In some cases, this can significantly increase the speed of data retrieval. Due to the way SQL Server works, tables must be reindexed individually. For databases with a large number of tables this can be real pain to do manually, but our script hits every table in the respective database and rebuilds all the indexes. Verifying Integrity [/Verify] In order for a database to remain both functional and produce accurate results, there are numerous integrity items which must be in place. Thankfully, physical and/or logical integrity problems are not very common, but it is good practice to occasionally run the integrity verification process on your databases and review the results. When the verify process is run through our script only errors are reported, so no news is good news.

Using the Script

The SQLMaint batch script is compatible with SQL 2005 and higher and must be run on a machine which has the SQLCMD tool installed (installed as part of the SQL Server installation). It is recommended you drop this script into a location set in your Windows PATH variable (i.e. C:Windows) so it can easily be called like any other application from the command line. To view the help information, simply enter:

SQLMaint /?

Examples To run a compact and then a verify on the database "MyDB" using a trusted connection:

SQLMaint MyDB /Compact /Verify

To run a reindex and then compact on "MyDB" on the named instance "Special" using the "sa" user with password "123456":

SQLMaint MyDB /S:.Special /U:sa /P:123456 /Reindex /Compact

Using from Inside of a Batch Script While the SQLMaint batch script can be used like an application from the command line, when you are using it inside of another batch script, it must be preceded with the CALL keyword. For example, this script runs all maintenance tasks on every non-system database on a default SQL Server installation using trusted authentication:

@ECHO OFF
SETLOCAL EnableExtensions
SET DBList="%TEMP%DBList.txt"
SqlCmd -E -h-1 -w 300 -Q "SET NoCount ON; SELECT Name FROM master.dbo.sysDatabases WHERE Name Not IN ('master','model','msdb','tempdb')" > %DBList%
FOR /F "usebackq tokens=1" %%i IN (%DBList%) DO (
CALL SQLMaint "%%i" /Compact /Reindex /Verify
ECHO +++++++++++
)
IF EXIST %DBList% DEL /F /Q %DBList%
ENDLOCAL

Download the SQLMaint Batch Script from SysadminGeek.com