0% found this document useful (0 votes)
6 views21 pages

SQL Server Health Check Report

The document outlines a SQL Server health check procedure that generates an HTML report detailing various server metrics such as CPU usage, memory usage, disk space, database connections, and backup status. It includes the creation of temporary tables to store data on server performance, blocking processes, and error logs, and it also prepares the data for email delivery. The procedure is designed to help monitor and maintain the health of SQL Server instances.

Uploaded by

vishwashc123
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
6 views21 pages

SQL Server Health Check Report

The document outlines a SQL Server health check procedure that generates an HTML report detailing various server metrics such as CPU usage, memory usage, disk space, database connections, and backup status. It includes the creation of temporary tables to store data on server performance, blocking processes, and error logs, and it also prepares the data for email delivery. The procedure is designed to help monitor and maintain the health of SQL Server instances.

Uploaded by

vishwashc123
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd

/****************************************************************************/

-- Report Type: HTML Report Delivers to Output Window / Mailbox


-- Parameters: DBMail Profile Name *, Email ID *, Server Name (Optional);
---- Server Details
---- Instance Information
---- Disk Space Usage
---- Tempdb Usage
---- CPU Usage
---- Memory Usage
---- Performance Counter Data
---- Missing Backup Report
---- Database Connections
---- Database Log Space Usage
---- SQL Agent Job Status
---- Blocking Process Information
---- Long Running Transactions
---- Top 20 Table Size
---- Index Analysis
---- SQL ErrorLog
/****************************************************************************/
/****************************************************************************/

IF EXISTS ( SELECT 1 FROM SYSOBJECTS WHERE ID = OBJECT_ID(N'[dbo].


[usp_SQLhealthcheck_report_basic]') AND [TYPE] = 'P')
BEGIN
DROP PROCEDURE [dbo].[usp_SQLhealthcheck_report_basic];
END
GO
CREATE PROCEDURE [dbo].[usp_SQLhealthcheck_report_basic](
@MailProfile NVARCHAR(200) = NULL,
@MailID NVARCHAR(2000) = NULL,
@Server VARCHAR(100) = NULL)
WITH ENCRYPTION
AS
BEGIN
SET NOCOUNT ON;
SET ARITHABORT ON;

DECLARE @ServerName VARCHAR(100);


SET @ServerName = ISNULL(@Server,@@SERVERNAME);

/*************************************************************/
/****************** Server Reboot Details ********************/
/*************************************************************/

CREATE TABLE #RebootDetails


(
LastRecycle datetime,
CurrentDate datetime,
UpTimeInDays varchar(100)
)
Insert into #RebootDetails
SELECT sqlserver_start_time 'Last Recycle',GetDate() 'Current Date', DATEDIFF(DD,
sqlserver_start_time,GETDATE())'Up Time in Days'
FROM sys.dm_os_sys_info;

CREATE TABLE #DBStatus


(
name VARCHAR(100),
state VARCHAR(10),
state_desc varchar(100)
)
Insert into #DBStatus
SELECT name,state,state_desc from [Link] where state != 0;

/*************************************************************/
/****************** Current Blocking Details *****************/
/*************************************************************/
CREATE TABLE #BlkProcesses
(
spid varchar(5),
Blkspid varchar(5),
PrgName varchar(100),
LoginName varchar(100),
ObjName varchar(100),
Query varchar(255)
)
insert into #BlkProcesses
SELECT [Link], BlockingSPID = [Link], substring(s.program_name,1,99),
SUBSTRING([Link],1,99),
ObjectName = substring( OBJECT_NAME(objectid, [Link]),1,99), Definition =
CAST(text AS VARCHAR(255))
FROM [Link] s
CROSS APPLY sys.dm_exec_sql_text (sql_handle)
WHERE [Link] > 50 AND [Link] > 0

/*************************************************************/
/****************** Errors audit for last 4 Days *************/
/*************************************************************/

CREATE TABLE #ErrorLogInfo_all


(
LogDate datetime,
processinfo varchar(200),
LogInfo varchar(1000)
)

CREATE TABLE #ErrorLogInfo


(
ID INT IDENTITY PRIMARY KEY NOT NULL,
LogDate varchar(100),
LogInfo varchar(2000)
)

DECLARE @A VARCHAR(10), @B VARCHAR(10);


SELECT @A = CONVERT(VARCHAR(20),GETDATE()-1,112);
SELECT @B = CONVERT(VARCHAR(20),GETDATE()+1,112);
INSERT INTO #ErrorLogInfo_all
EXEC XP_READERRORLOG 0, 1,N'Login', N'Failed', @A,@B,'DESC';

INSERT INTO #ErrorLogInfo (LogDate,LogInfo)


select DISTINCT CONVERT(VARCHAR(20),GETDATE()+1,111) "LogDate",LogInfo from
#ErrorLogInfo_all;

/***********************************************************/
/************* Windows Disk Space Details ******************/
/***********************************************************/

CREATE TABLE #FreeSpace (DName CHAR(1), Free_MB BIGINT, Free_GB DECIMAL(16,2))


INSERT INTO #FreeSpace (DName,Free_MB) EXEC XP_FIXEDDRIVES;
UPDATE #FreeSpace SET Free_GB = CAST(Free_MB / 1024.00 AS DECIMAL(16,2));

/*************************************************************/
/************* SQL Server CPU Usage Details ******************/
/*************************************************************/
Create table #CPU(
servername varchar(100),
EventTime2 datetime,
SQLProcessUtilization varchar(50),
SystemIdle varchar(50),
OtherProcessUtilization varchar(50),
load_date datetime
)
DECLARE @ts BIGINT; DECLARE @lastNmin TINYINT;
SET @lastNmin = 240;
SELECT @ts =(SELECT cpu_ticks/(cpu_ticks/ms_ticks) FROM sys.dm_os_sys_info);
insert into #CPU
SELECT TOP 10 * FROM (
SELECT TOP(@lastNmin)
@ServerName AS 'ServerName',
DATEADD(ms,-1 *(@ts - [timestamp]),GETDATE())AS [Event_Time],
SQLProcessUtilization AS [SQLServer_CPU_Utilization],
SystemIdle AS [System_Idle_Process],
100 - SystemIdle - SQLProcessUtilization AS [Other_Process_CPU_Utilization],
GETDATE() AS 'LoadDate'
FROM (SELECT [Link]('(./Record/@id)[1]','int')AS record_id,
[Link]('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]','int')AS
[SystemIdle],
[Link]('(./Record/SchedulerMonitorEvent/SystemHealth/ProcessUtilization)
[1]','int')AS [SQLProcessUtilization],
[timestamp]
FROM (SELECT[timestamp], convert(xml, record) AS [record]
FROM sys.dm_os_ring_buffers
WHERE ring_buffer_type =N'RING_BUFFER_SCHEDULER_MONITOR'AND record LIKE'%%')AS
x )AS y
ORDER BY SystemIdle ASC) d

/*************************************************************/
/************* SQL Server Memory Usage Details ***************/
/*************************************************************/

CREATE TABLE #Memory_BPool (


BPool_Committed_MB VARCHAR(50),
BPool_Commit_Tgt_MB VARCHAR(50),
BPool_Visible_MB VARCHAR(50));

-- SQL server 2008 / 2008 R2


--INSERT INTO #Memory_BPool
--SELECT
-- (bpool_committed*8)/1024.0 as BPool_Committed_MB,
-- (bpool_commit_target*8)/1024.0 as BPool_Commit_Tgt_MB,
-- (bpool_visible*8)/1024.0 as BPool_Visible_MB
--FROM sys.dm_os_sys_info;

---- SQL server 2012 / 2014 / 2016


INSERT INTO #Memory_BPool
SELECT
(committed_kb)/1024.0 as BPool_Committed_MB,
(committed_target_kb)/1024.0 as BPool_Commit_Tgt_MB,
(visible_target_kb)/1024.0 as BPool_Visible_MB
FROM sys.dm_os_sys_info;

CREATE TABLE #Memory_sys (


total_physical_memory_mb VARCHAR(50),
available_physical_memory_mb VARCHAR(50),
total_page_file_mb VARCHAR(50),
available_page_file_mb VARCHAR(50),
Percentage_Used VARCHAR(50),
system_memory_state_desc VARCHAR(50));

INSERT INTO #Memory_sys


select
total_physical_memory_kb/1024 AS total_physical_memory_mb,
available_physical_memory_kb/1024 AS available_physical_memory_mb,
total_page_file_kb/1024 AS total_page_file_mb,
available_page_file_kb/1024 AS available_page_file_mb,
100 - (100 * CAST(available_physical_memory_kb AS
DECIMAL(18,3))/CAST(total_physical_memory_kb AS DECIMAL(18,3)))
AS 'Percentage_Used',
system_memory_state_desc
from sys.dm_os_sys_memory;

CREATE TABLE #Memory_process(


physical_memory_in_use_GB VARCHAR(50),
locked_page_allocations_GB VARCHAR(50),
virtual_address_space_committed_GB VARCHAR(50),
available_commit_limit_GB VARCHAR(50),
page_fault_count VARCHAR(50))

INSERT INTO #Memory_process


select
physical_memory_in_use_kb/1048576.0 AS 'Physical_Memory_In_Use(GB)',
locked_page_allocations_kb/1048576.0 AS 'Locked_Page_Allocations(GB)',
virtual_address_space_committed_kb/1048576.0 AS
'Virtual_Address_Space_Committed(GB)',
available_commit_limit_kb/1048576.0 AS 'Available_Commit_Limit(GB)',
page_fault_count as 'Page_Fault_Count'
from sys.dm_os_process_memory;

CREATE TABLE #Memory(


ID INT IDENTITY NOT NULL,
Parameter VARCHAR(200),
Value VARCHAR(100));

INSERT INTO #Memory


SELECT 'BPool_Committed_MB',BPool_Committed_MB FROM #Memory_BPool
UNION
SELECT 'BPool_Commit_Tgt_MB', BPool_Commit_Tgt_MB FROM #Memory_BPool
UNION
SELECT 'BPool_Visible_MB', BPool_Visible_MB FROM #Memory_BPool
UNION
SELECT 'Total_Physical_Memory_MB',total_physical_memory_mb FROM #Memory_sys
UNION
SELECT 'Available_Physical_Memory_MB',available_physical_memory_mb FROM #Memory_sys
UNION
SELECT 'Percentage_Used',Percentage_Used FROM #Memory_sys
UNION
SELECT 'System_memory_state_desc',system_memory_state_desc FROM #Memory_sys
UNION
SELECT 'Total_page_file_mb',total_page_file_mb FROM #Memory_sys
UNION
SELECT 'Available_page_file_mb',available_page_file_mb FROM #Memory_sys
UNION
SELECT 'Physical_memory_in_use_GB',physical_memory_in_use_GB FROM #Memory_process
UNION
SELECT 'Locked_page_allocations_GB',locked_page_allocations_GB FROM #Memory_process

UNION
SELECT 'Virtual_Address_Space_Committed_GB',virtual_address_space_committed_GB FROM
#Memory_process
UNION
SELECT 'Available_Commit_Limit_GB',available_commit_limit_GB FROM #Memory_process
UNION
SELECT 'Page_Fault_Count',page_fault_count FROM #Memory_process;

/******************************************************************/
/*************** Database Backup Report ***************************/
/******************************************************************/
CREATE TABLE #Backup_Report(
name VARCHAR(300),
last_backup_time VARCHAR(50),
recovery_model_desc VARCHAR(50),
state_desc VARCHAR(50),
backup_type VARCHAR(50),
physical_device_name VARCHAR(300));

WITH CTE_Backup AS
(
SELECT database_name,backup_start_date,type,physical_device_name
,Row_Number() OVER(PARTITION BY database_name,[Link]
ORDER BY backup_start_date DESC) AS RowNum
FROM msdb..backupset BS
JOIN [Link] BMF
ON BS.media_set_id=BMF.media_set_id
)INSERT INTO #Backup_Report
SELECT [Link]
,ISNULL(CONVERT(VARCHAR,backup_start_date),'No backups') AS
last_backup_time
,D.recovery_model_desc
,state_desc,
CASE WHEN type ='D' THEN 'Full database'
WHEN type ='I' THEN 'Differential database'
WHEN type ='L' THEN 'Log'
WHEN type ='F' THEN 'File or filegroup'
WHEN type ='G' THEN 'Differential file'
WHEN type ='P' THEN 'Partial'
WHEN type ='Q' THEN 'Differential partial'
ELSE 'Unknown' END AS backup_type
,physical_device_name
FROM [Link] D
LEFT JOIN CTE_Backup CTE
ON [Link] = CTE.database_name
AND RowNum =1

/*************************************************************/
/****************** Connection Details ***********************/
/*************************************************************/

-- Number of connection on the instance grouped by hostnames


Create table #ConnInfo(
Hostname varchar(100),
NumberOfconn varchar(10)
)
insert into #ConnInfo
SELECT Case when len(hostname)=0 Then 'Internal Process' Else hostname
END,count(*)NumberOfconnections
FROM [Link]
GROUP BY hostname

/*************************************************************/
/************** Currently Running Jobs Info ******************/
/*************************************************************/
Create table #JobInfo(
Server_Name varchar(100),
Step_Name varchar(100),
SQL_Job_Name varchar(100),
RunDateTime varchar(100),
Failure_Date varchar(100),
StepDuration varchar(100),
ExecutionStatus varchar(100),
Error_Message nvarchar(2000)
)
insert into #JobInfo
SELECT DISTINCT [Link] AS [Server_Name],
T1.step_name AS [Step_Name],
SUBSTRING([Link],1,140) AS [SQL_Job_Name],
[Link].agent_datetime(run_date, run_time) as 'RunDateTime',
CAST(CONVERT(DATETIME,CAST(run_date AS CHAR(8)),101) AS CHAR(11)) AS
[Failure_Date],
T1.run_duration StepDuration,
CASE T1.run_status
WHEN 0 THEN 'Failed'
WHEN 1 THEN 'Succeeded'
WHEN 2 THEN 'Retry'
WHEN 3 THEN 'Cancelled'
WHEN 4 THEN 'In Progress'
END AS ExecutionStatus,
[Link] AS [Error_Message]
FROM
msdb..sysjobhistory T1 INNER JOIN msdb..sysjobs T2 ON T1.job_id = T2.job_id
WHERE
T1.run_status NOT IN (1, 4)
AND T1.step_id != 0
AND run_date >= CONVERT(CHAR(8), (SELECT DATEADD (DAY,(-1), GETDATE())), 112)

/*************************************************************/
/****************** Tempdb File Info *************************/
/*************************************************************/
-- tempdb file usage
Create table #tempdbfileusage(
servername varchar(100),
databasename varchar(100),
filename varchar(100),
physicalName varchar(100),
filesizeMB varchar(100),
availableSpaceMB varchar(100),
percentfull varchar(100)
)

DECLARE @TEMPDBSQL NVARCHAR(4000);


SET @TEMPDBSQL = ' USE Tempdb;
SELECT CONVERT(VARCHAR(100), @@SERVERNAME) AS [server_name]
,[Link] AS [database_name]
,mf.[name] AS [file_logical_name]
,mf.[filename] AS[file_physical_name]
,convert(FLOAT, mf.[size]/128) AS [file_size_mb]
,convert(FLOAT, (mf.[size]/128 - (CAST(FILEPROPERTY(mf.[name],
''SpaceUsed'') AS int)/128))) as [available_space_mb]
,convert(DECIMAL(38,2), (CAST(FILEPROPERTY(mf.[name],
''SpaceUsed'') AS int)/128.0)/(mf.[size]/128.0))*100 as [percent_full]
FROM [Link] mf
JOIN master..sysdatabases db
ON [Link] = db_id()';
--PRINT @TEMPDBSQL;
insert into #tempdbfileusage
EXEC SP_EXECUTESQL @TEMPDBSQL;

/*************************************************************/
/****************** Database Log Usage ***********************/
/*************************************************************/
CREATE TABLE #LogSpace(
DBName VARCHAR(100),
LogSize VARCHAR(50),
LogSpaceUsed_Percent VARCHAR(100),
LStatus CHAR(1));

INSERT INTO #LogSpace


EXEC ('DBCC SQLPERF(LOGSPACE) WITH NO_INFOMSGS;');

/********************************************************************/
/****************** Long Running Transactions ***********************/
/********************************************************************/

CREATE TABLE #OpenTran_Detail(


[SPID] [varchar](20) NULL,
[TranID] [varchar](50) NULL,
[User_Tran] [varchar](5) NOT NULL,
[DBName] [nvarchar](250) NULL,
[Login_Time] [varchar](60) NULL,
[Duration] [varchar](20) NULL,
[Last_Batch] [varchar](200) NULL,
[Status] [nvarchar](50) NULL,
[LoginName] [nvarchar](250) NULL,
[HostName] [nvarchar](250) NULL,
[ProgramName] [nvarchar](250) NULL,
[CMD] [nvarchar](50) NULL,
[SQL] [nvarchar](max) NULL,
[Blocked] [varchar](6) NULL
);

/*************************************************************/
/****************** HTML Preparation *************************/
/*************************************************************/

DECLARE @TableHTML VARCHAR(MAX),


@StrSubject VARCHAR(100),
@Oriserver VARCHAR(100),
@Version VARCHAR(250),
@Edition VARCHAR(100),
@ISClustered VARCHAR(100),
@SP VARCHAR(100),
@ServerCollation VARCHAR(100),
@SingleUser VARCHAR(5),
@LicenseType VARCHAR(100),
@Cnt int,
@URL varchar(1000),
@Str varchar(1000),
@NoofCriErrors varchar(3)

-- Variable Assignment

SELECT @Version = @@version


SELECT @Edition = CONVERT(VARCHAR(100), serverproperty('Edition'))

SET @Cnt = 0
IF serverproperty('IsClustered') = 0
BEGIN
SELECT @ISClustered = 'No'
END
ELSE
BEGIN
SELECT @ISClustered = 'YES'
END
SELECT @SP = CONVERT(VARCHAR(100), SERVERPROPERTY ('productlevel'))

SELECT @ServerCollation = CONVERT(VARCHAR(100), SERVERPROPERTY ('Collation'))

SELECT @LicenseType = CONVERT(VARCHAR(100), SERVERPROPERTY ('LicenseType'))

SELECT @SingleUser = CASE SERVERPROPERTY ('IsSingleUser')

WHEN 1 THEN 'Yes'


WHEN 0 THEN 'No'
ELSE
'null' END
SELECT @OriServer = CONVERT(VARCHAR(50), SERVERPROPERTY('servername'))

SELECT @strSubject = 'Database Server Health Check ('+ CONVERT(VARCHAR(100),


@SERVERNAME) + ')'

SET @TableHTML =
'
'
SET @TableHTML = @TableHTML +
'<div><img align="right" src="Images/Logo_Image.jpg" style="height: 100px; width:
300px"/><font face="Verdana" size="4" color="#3399ff"><H2><bold>Database Health
Check Report</bold></H2></font></div>
<table border="1" cellpadding="0" cellspacing="0" style="border-collapse:
collapse" bordercolor="#111111" width="47%" id="AutoNumber1" height="50">

<tr>
<td width="39%" height="22" bgcolor="#000080"><b>
<font face="Verdana" size="2" color="#FFFFFF">Server Name</font></b></td>

</tr>
<tr>
<td width="39%" height="27"><font face="Verdana" size="2"><b><u>' + @ServerName
+'</b></u></font></td>
</tr>
</table>
<table id="AutoNumber1" style="BORDER-COLLAPSE: collapse" borderColor="#111111"
height="40" cellSpacing="0" cellPadding="0" width="933" border="2">

<tr>
<td align="Center" width="50%" bgColor="#000080" height="15"><b>

<font face="Verdana" color="#ffffff" size="1">Version</font></b></td>

<td align="Center" width="17%" bgColor="#000080" height="15"><b>

<font face="Verdana" color="#ffffff" size="1">Edition</font></b></td>

<td align="Center" width="35%" bgColor="#000080" height="15"><b>

<font face="Verdana" color="#ffffff" size="1">Service Pack</font></b></td>

<td align="Center" width="60%" bgColor="#000080" height="15"><b>

<font face="Verdana" color="#ffffff" size="1">Collation</font></b></td>

<td align="Center" width="93%" bgColor="#000080" height="15"><b>

<font face="Verdana" color="#ffffff" size="1">LicenseType</font></b></td>

<td align="Center" width="40%" bgColor="#000080" height="15"><b>

<font face="Verdana" color="#ffffff" size="1">SingleUser</font></b></td>

<td align="Center" width="93%" bgColor="#000080" height="15"><b>

<font face="Verdana" color="#ffffff" size="1">Clustered</font></b></td>


</tr>
<tr>
<td align="Center" width="50%" height="27"><font face="Verdana"
size="1">'+@version +'</font></td>
<td align="Center" width="17%" height="27"><font face="Verdana"
size="1">'+@edition+'</font></td>
<td align="Center" width="18%" height="27"><font face="Verdana"
size="1">'+@SP+'</font></td>
<td align="Center" width="17%" height="27"><font face="Verdana"
size="1">'+@ServerCollation+'</font></td>
<td align="Center" width="25%" height="27"><font face="Verdana"
size="1">'+@LicenseType+'</font></td>
<td align="Center" width="25%" height="27"><font face="Verdana"
size="1">'+@SingleUser+'</font></td>
<td align="Center" width="93%" height="27"><font face="Verdana"
size="1">'+@isclustered+'</font></td>
</tr>'

SELECT
@TableHTML = @TableHTML +
'</table>
<p style="margin-top: 1; margin-bottom: 0">&nbsp;</p>

<font face="Verdana" size="4" color="#3399ff"><H3><bold>Instance last


Recycled</bold></H3></font>
<table style="BORDER-COLLAPSE: collapse" borderColor="#111111" cellPadding="0"
width="47%" bgColor="#ffffff" borderColorLight="#000000" border="2">

<tr>
<th align="Center" width="50" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">Last Recycle</font></th>

<th align="Center" width="50" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">Current DateTime</font></th>

<th align="Center" width="50" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">UpTimeInDays</font></th>

</tr>'

SELECT
@TableHTML = @TableHTML +
'<tr>
<td align="Center"><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100),
LastRecycle ), '') +'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100),
CurrentDate ), '') +'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100),
UpTimeInDays ), '') +'</font></td>' +
'</tr>'
FROM
#RebootDetails

SELECT
@TableHTML = @TableHTML +
'</table>
<p style="margin-top: 1; margin-bottom: 0">&nbsp;</p>

<font face="Verdana" size="4" color="#3399ff"><H3><bold>Database


Status</bold></H3></font>
<table style="BORDER-COLLAPSE: collapse" borderColor="#111111" cellPadding="0"
width="47%" bgColor="#ffffff" borderColorLight="#000000" border="2">

<tr>
<th align="Center" width="50" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">ServerName</font></th>

<th align="Center" width="50" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">name</font></th>

<th align="Center" width="50" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">state_desc</font></th>

</tr>'

SELECT
@TableHTML = @TableHTML +
'<tr>
<td align="Center"><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100),
name ), '') +'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(10),
state ), '') +'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100),
state_desc ), '') +'</font></td>' +
'</tr>'
--CASE WHEN state !=0 THEN
--'<td align="Center"><font face="Verdana" size="1" color="#FF0000"><b>' +
ISNULL(CONVERT(VARCHAR(100), name,state,state_desc ), '') +'</font></td>'
--ELSE
--'<td align="Center"><font face="Verdana" size="1" color="#40C211"><b>' +
ISNULL(CONVERT(VARCHAR(100),'All Databases are ONLINE'), '') +'</font></td>'
--END +
FROM
#DBStatus

/***** Free Disk Space Report ****/


SELECT
@TableHTML = @TableHTML +
'</table>
<p style="margin-top: 1; margin-bottom: 0">&nbsp;</p>

<font face="Verdana" size="4" color="#3399ff"><H3><bold>Disk Space


Report</bold></H3></font>
<table id="AutoNumber1" style="BORDER-COLLAPSE: collapse" borderColor="#111111"
height="40" cellSpacing="0" cellPadding="0" width="47%" border="2">

<tr>
<th align="Center" width="136" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">Drive_Name</font></th>


<th align="Center" width="200" bgColor="#000080">
<font face="Verdana" size="1" color="#FFFFFF">Free_Space_GB</font></th>

</tr>'
SELECT
@TableHTML = @TableHTML +
'<tr>
<td align="Center"><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100),
DName ), '') +'</font></td>' +
CASE WHEN Free_GB < 30 THEN
'<td align="Center"><font face="Verdana" size="1" color="#FF0000"><b>' +
ISNULL(CONVERT(VARCHAR(100), Free_GB), '') +'</font></td>'
ELSE
'<td align="Center"><font face="Verdana" size="1" color="#40C211"><b>' +
ISNULL(CONVERT(VARCHAR(100), Free_GB), '') +'</font></td>'
END +
'</tr>'
FROM
#FreeSpace

/**** Tempdb File Usage *****/


SELECT
@TableHTML = @TableHTML +
'</table>
<p style="margin-top: 1; margin-bottom: 0">&nbsp;</p>

<font face="Verdana" size="4" color="#3399ff"><H3><bold>Tempdb File


Usage</bold></H3></font>
<table id="AutoNumber1" style="BORDER-COLLAPSE: collapse" borderColor="#111111"
height="40" cellSpacing="0" cellPadding="0" width="933" border="2">

<tr>
<th align="Center" width="300" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">Database Name</font></th>

<th align="Center" width="300" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">File Name</font></th>


<th align="Center" width="250" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">Physical Name</font></th>

<th align="Center" width="250" bgColor="#000080">


<font face="Verdana" size="1" color="#FFFFFF">FileSize MB</font></th>

<th align="Center" width="200" bgColor="#000080">


<font face="Verdana" size="1" color="#FFFFFF">Available MB</font></th>

<th align="Center" width="200" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">Percent_full </font></th>

</tr>'
select
@TableHTML = @TableHTML +
'<tr>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL(databasename, '') +
'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL(FileName, '')
+'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL(physicalName, '')
+'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL(filesizeMB, '')
+'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL(availableSpaceMB, '')
+'</font></td>' +
CASE WHEN CONVERT(DECIMAL(10,3),percentfull) >80.00 THEN
'<td align="Center"><font face="Verdana" size="1" color="#FF0000"><b>' +
ISNULL(percentfull, '') +'</b></font></td></tr>'

ELSE
'<td align="Center"><font face="Verdana" size="1">' + ISNULL(percentfull, '')
+'</font></td></tr>' END
from
#tempdbfileusage

/**** CPU Usage *****/


SELECT
@TableHTML = @TableHTML +
'</table>
<p style="margin-top: 1; margin-bottom: 0">&nbsp;</p>

<font face="Verdana" size="4" color="#3399ff"><H3><bold>CPU


Usage</bold></H3></font>
<table id="AutoNumber1" style="BORDER-COLLAPSE: collapse" borderColor="#111111"
height="40" cellSpacing="0" cellPadding="0" width="80%" border="2">

<tr>
<th align="Center" width="300" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">System Time</font></th>

<th align="Center" width="300" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">SQLProcessUtilization</font></th>

<th align="Center" width="250" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">SystemIdle</font></th>

<th align="Center" width="250" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">OtherProcessUtilization</font></th>

<th align="Center" width="200" bgColor="#000080">


<font face="Verdana" size="1" color="#FFFFFF">load DateTime</font></th>

</tr>'
SELECT
@TableHTML = @TableHTML +
'<tr>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100),
EventTime2 ), '') +'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' +
ISNULL(CONVERT(VARCHAR(100), SQLProcessUtilization ), '') +'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' +
ISNULL(CONVERT(VARCHAR(100), SystemIdle ), '') +'</font></td>' +

'<td align="Center"><font face="Verdana" size="1">' +


ISNULL(CONVERT(VARCHAR(100), OtherProcessUtilization ), '') +'</font></td>' +

'<td align="Center"><font face="Verdana" size="1">' +


ISNULL(CONVERT(VARCHAR(100), load_date ), '') +'</font></td> </tr>'

FROM
#CPU ORDER BY EventTime2;

/***** Memory Usage ****/


SELECT
@TableHTML = @TableHTML +
'</table>
<p style="margin-top: 1; margin-bottom: 0">&nbsp;</p>

<font face="Verdana" size="4" color="#3399ff"><H3><bold>Memory


Usage</bold></H3></font>
<table id="AutoNumber1" style="BORDER-COLLAPSE: collapse" borderColor="#111111"
height="40" cellSpacing="0" cellPadding="0" width="47%" border="2">

<tr>
<th align="left" width="136" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">Parameter</font></th>

<th align="left" width="200" bgColor="#000080">


<font face="Verdana" size="1" color="#FFFFFF">Value</font></th>
</tr>'
SELECT
@TableHTML = @TableHTML +
'<tr>
<td><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(200), Parameter ),
'') +'</font></td>' +
'<td><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100), Value ), '')
+'</font></td>' +
'</tr>'
FROM
#Memory ORDER BY ID;

/***** Database Backup Report ****/


SELECT
@TableHTML = @TableHTML +
'</table>
<p style="margin-top: 1; margin-bottom: 0">&nbsp;</p>

<font face="Verdana" size="4" color="#3399ff"><H3><bold>Latest Backup


status</bold></H3></font>
<table id="AutoNumber1" style="BORDER-COLLAPSE: collapse" borderColor="#111111"
height="40" cellSpacing="0" cellPadding="0" width="47%" border="2">

<tr>
<th align="left" width="136" bgColor="#000080">
<font face="Verdana" size="1" color="#FFFFFF">Database_Name</font></th>

<th align="left" width="200" bgColor="#000080">


<font face="Verdana" size="1" color="#FFFFFF">Last_Backup</font></th>
<th align="left" width="200" bgColor="#000080">
<font face="Verdana" size="1" color="#FFFFFF">Recovery Model</font></th>
<th align="left" width="200" bgColor="#000080">
<font face="Verdana" size="1" color="#FFFFFF">DB Status</font></th>
<th align="left" width="200" bgColor="#000080">
<font face="Verdana" size="1" color="#FFFFFF">Backup type</font></th>
<th align="left" width="200" bgColor="#000080">
<font face="Verdana" size="1" color="#FFFFFF">Path</font></th>
</tr>'
SELECT
@TableHTML = @TableHTML +
'<tr>'+
'<td align="Center"><font face="Verdana" size="1">' + ISNULL(name, '') +
'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL(last_backup_time, '')
+'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL(recovery_model_desc,
'') +'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL(state_desc, '')
+'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL(backup_type, '')
+'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL(physical_device_name,
'') +'</font></td></tr>'

FROM #Backup_Report

/****** Connection Information *****/

SELECT
@TableHTML = @TableHTML +
'</table>
<p style="margin-top: 1; margin-bottom: 0">&nbsp;</p>

<font face="Verdana" size="4" color="#3399ff"><H3><bold>Total Number of Database


Connections</bold></H3></font>
<table style="BORDER-COLLAPSE: collapse" borderColor="#111111" cellPadding="0"
width="47%" bgColor="#ffffff" borderColorLight="#000000" border="2">

<tr>
<th align="Center" width="136" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">Host Name</font></th>

<th align="Center" width="200" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">Total</font></th>

</tr>'

SELECT
@TableHTML = @TableHTML +
'<tr>
<td align="Center"><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100),
Hostname ), '') +'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100),
NumberOfconn ), '') +'</font></td>' +
'</tr>'
FROM
#ConnInfo

/***** Log Space Usage ****/


SELECT
@TableHTML = @TableHTML +
'</table>
<p style="margin-top: 1; margin-bottom: 0">&nbsp;</p>

<font face="Verdana" size="4" color="#3399ff"><H3><bold>Database Log Space


Usage</bold></H3></font>
<table id="AutoNumber1" style="BORDER-COLLAPSE: collapse" borderColor="#111111"
height="40" cellSpacing="0" cellPadding="0" width="47%" border="2">

<tr>
<th align="left" width="136" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">DatabaseName</font></th>

<th align="left" width="200" bgColor="#000080">


<font face="Verdana" size="1" color="#FFFFFF">Log_Space_Used</font></th>

<th align="left" width="200" bgColor="#000080">


<font face="Verdana" size="1" color="#FFFFFF">Log_Usage_%</font></th>

</tr>'
SELECT
@TableHTML = @TableHTML +
'<tr>
<td><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100), DBName ), '')
+'</font></td>' +
'<td><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100), LogSize ),
'') +'</font></td>' +
CASE WHEN CONVERT(DECIMAL(10,3),LogSpaceUsed_Percent) >80.00 THEN
'<td><font face="Verdana" size="1" color="#FF0000"><b>' +
ISNULL(CONVERT(VARCHAR(100), LogSpaceUsed_Percent ), '') +'</b></font></td>'
ELSE
'<td><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100),
LogSpaceUsed_Percent ), '') +'</font></td>'
END +
'</tr>'
FROM
#LogSpace

/******** Job Info *******/


SELECT
@TableHTML = @TableHTML +
'</table>
<p style="margin-top: 0; margin-bottom: 0">&nbsp;</p>

<font face="Verdana" size="4" color="#3399ff"><H3><bold>SQL Agent Jobs


Status</bold></H3></font>' +
'<table style="BORDER-COLLAPSE: collapse" borderColor="#111111" cellPadding="0"
width="933" bgColor="#ffffff" borderColorLight="#000000" border="2">
<tr>
<th align="left" width="430" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">Server_Name</font></th>


<th align="left" width="70" bgColor="#000080">
<font face="Verdana" size="1" color="#FFFFFF">Step_Name</font></th>

<th align="left" width="85" bgColor="#000080">


<font face="Verdana" size="1" color="#FFFFFF">SQL_Job_Name</font></th>

<th align="left" width="183" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">RunDateTime</font></th>

<th align="left" width="136" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">Failure_Date</font></th>

<th align="left" width="136" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">StepDuration</font></th>


<th align="left" width="146" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">ExecutionStatus</font></th>


<th align="left" width="136" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">Error_Message</font></th>

</tr>'

SELECT
@TableHTML = ISNULL(CONVERT(VARCHAR(MAX), @TableHTML), 'No Job Running') +
'<tr><td><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100),
Server_Name), '') +'</font></td>' +
'<td><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100), Step_Name),'')
+ '</font></td>' +
'<td><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100),
SQL_Job_Name),'') + '</font></td>' +
'<td><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100),
RunDateTime),'') +'</font></td>' +
'<td><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100),
Failure_Date),'') +'</font></td>' +
'<td><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100),
StepDuration),'') +'</font></td>' +
'<td><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100),
ExecutionStatus),'') +'</font></td>' +
'<td><font face="Verdana" size="1">' +
ISNULL(CONVERT(VARCHAR(100),Error_Message ),'') + '</font></td></tr>'
FROM
#JobInfo

/****** Blocking Information ****/

SELECT
@TableHTML = @TableHTML +
'</table>
<p style="margin-top: 1; margin-bottom: 0">&nbsp;</p>

<font face="Verdana" size="4" color="#3399ff"><H3><bold>Blocking Process


Information</bold></H3></font>
<table style="BORDER-COLLAPSE: collapse" borderColor="#111111" cellPadding="0"
width="933" bgColor="#ffffff" borderColorLight="#000000" border="2">

<tr>
<th align="Center" width="50" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">ServerName</font></th>

<th align="Center" width="50" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">SpID</font></th>

<th align="Center" width="50" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">BlockingSPID</font></th> <th


align="Center" width="50" bgColor="#000080">
<font face="Verdana" size="1" color="#FFFFFF">ProgramName</font></th>

<th align="Center" width="50" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">LoginName</font></th>

<th align="Center" width="40" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">ObjName</font></th>

<th align="left" width="150" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">Query</font></th>

</tr>'

SELECT
@TableHTML = ISNULL(CONVERT(VARCHAR(MAX), @TableHTML), 'No Blockings found') +

'<tr>
<td><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100), @SERVERNAME ),
'') +'</font></td>' +
'<td><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100), spid ), '')
+'</font></td>' +
'<td><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100), Blkspid ),
'') +'</font></td>' +
'<td><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100), PrgName ),
'') +'</font></td>' +
'<td><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100), LoginName ),
'') +'</font></td>' +
'<td><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100), ObjName ),
'') +'</font></td>' +
'<td><font face="Verdana" size="1">' + ISNULL(CONVERT(VARCHAR(100), Query ), '')
+'</font></td>' +
'</tr>'
FROM
#BlkProcesses
ORDER BY spid
/**** Long running Transactions*****/
SELECT
@TableHTML = @TableHTML +
'</table>
<p style="margin-top: 1; margin-bottom: 0">&nbsp;</p>

<font face="Verdana" size="4" color="#3399ff"><H3><bold>Long Running


Transactions</bold></H3></font>
<table id="AutoNumber1" style="BORDER-COLLAPSE: collapse" borderColor="#111111"
height="40" cellSpacing="0" cellPadding="0" width="933" border="2">

<tr>
<th align="Center" width="300" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">SPID</font></th>


<th align="Center" width="300" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">TranID</font></th>


<th align="Center" width="250" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">User_Tran</font></th>


<th align="Center" width="250" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">DB_Name</font></th>


<th align="Center" width="250" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">Login_Time</font></th>

<th align="Center" width="250" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">Duration</font></th>


<th align="Center" width="250" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">Last_Batch</font></th>

<th align="Center" width="250" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">Status</font></th>


<th align="Center" width="250" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">LoginName</font></th>


<th align="Center" width="250" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">Host_Name</font></th>


<th align="Center" width="250" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">PrgName</font></th>


<th align="Center" width="250" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">CMD</font></th>


<th align="Center" width="200" bgColor="#000080">
<font face="Verdana" size="1" color="#FFFFFF">SQL</font></th>
<th align="Center" width="200" bgColor="#000080">

<font face="Verdana" size="1" color="#FFFFFF">Blocked </font></th>


</tr>'
select
@TableHTML = ISNULL(CONVERT(VARCHAR(MAX), @TableHTML), 'No long running
transactions observed') +
'<tr>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL(SPID, '') +
'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL(TranID, '')
+'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL(User_Tran, '')
+'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL(DBName, '')
+'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL(Login_Time, '')
+'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL(Duration, '')
+'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL(Last_Batch, '')
+'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL([Status], '')
+'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL(LoginName, '')
+'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL(HostName, '')
+'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL(ProgramName, '')
+'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL(CMD, '')
+'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL([SQL], '')
+'</font></td>' +
'<td align="Center"><font face="Verdana" size="1">' + ISNULL(Blocked, '')
+'</font></td></tr>'
from
#OpenTran_Detail

/*** Error Log *****/


SELECT
@TableHTML = @TableHTML +
'</table>
<p style="margin-top: 0; margin-bottom: 0">&nbsp;</p>

<font face="Verdana" size="4" color="#3399ff"><H3><bold>SQL


ErrorLog</bold></H3></font>' +
'<table style="BORDER-COLLAPSE: collapse" borderColor="#111111" cellPadding="0"
width="47%" bgColor="#ffffff" borderColorLight="#000000" border="1">

<tr>
<td width="20%" bgColor="#000080" height="15"><b>
<font face="Verdana" color="#ffffff" size="1">Check for Suspecious Errors - If
Any</font></b></td>
</tr>
</table>
<table style="BORDER-COLLAPSE: collapse" borderColor="#111111" cellPadding="0"
width="47%" bgColor="#ffffff" borderColorLight="#000000" border="2">

<tr>
<td width="20%" bgColor="#000080" height="15"><b>
<font face="Verdana" color="#ffffff" size="1">Error Log DateTime</font></b></td>

<td width="80%" bgColor="#000080" height="15"><b>


<font face="Verdana" color="#ffffff" size="1">Error Message</font></b></td>

</tr>';

SELECT
@TableHTML = @TableHTML + '<tr>
<td width="20%" height="27"><font face="Verdana" size="1">'+
ISNULL(CONVERT(VARCHAR(100),LogDate ),'') +'</font></td>

<td width="80%" height="27"><font face="Verdana"


size="1">'+ISNULL(CONVERT(VARCHAR(2000),LogInfo ),'')+'</font></td>

</tr>'
FROM #ErrorLogInfo ORDER BY ID;

/****** End to HTML Formatting ***/


SELECT
@TableHTML = @TableHTML + '</table>' +
'<p style="margin-top: 0; margin-bottom: 0">&nbsp;</p>

<p>&nbsp;</p>'

IF (@MailProfile IS NOT NULL AND @MailID IS NOT NULL)


BEGIN
EXEC [Link].sp_send_dbmail
@profile_name = @MailProfile,
@recipients = @MailID,
@subject = @strSubject,
@body = @TableHTML,
@body_format = 'HTML';
END

SELECT @TableHTML "HC_Report";

DROP TABLE #RebootDetails


DROP TABLE #FreeSpace;
DROP TABLE #BlkProcesses
DROP TABLE #ErrorLogInfo
DROP TABLE #CPU
DROP TABLE #Memory_BPool;
DROP TABLE #Memory_sys;
DROP TABLE #Memory_process;
DROP TABLE #Memory;
DROP TABLE #Backup_Report;
DROP TABLE #ConnInfo;
DROP TABLE #JobInfo;
DROP TABLE #tempdbfileusage;
DROP TABLE #LogSpace;
DROP TABLE #OpenTran_Detail;

SET NOCOUNT OFF;


SET ARITHABORT OFF;
END

You might also like