/****************************************************************************/
-- 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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </p>
<p> </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