forked from mtikoian/SQLDBA-SSMS-Solution
-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathv1.0 - [usp_GetMail_4_SQLAlerts].sql
191 lines (166 loc) · 6.68 KB
/
v1.0 - [usp_GetMail_4_SQLAlerts].sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
USE DBA
GO
-- EXEC DBA..[usp_GetMail_4_SQLAlerts] @p_Option = 'JobBlockers' ,@p_recipients = '[email protected];[email protected]'
-- EXEC DBA..[usp_GetMail_4_SQLAlerts] @p_Option = 'JobBlockers' ,@p_recipients = '[email protected];[email protected]'
-- EXEC DBA..[usp_GetMail_4_SQLAlerts] @p_Option = 'JobBlockers' ,@p_recipients = '[email protected];[email protected]';
-- EXEC DBA..[usp_GetMail_4_SQLAlerts] @p_Option = 'JobBlockers' ,@p_recipients = '[email protected];';
-- EXEC DBA..[usp_GetMail_4_SQLAlerts] @p_Option = 'JobBlockers' ,@p_recipients = '[email protected];' ,@p_Verbose = 1
IF OBJECT_ID('dbo.usp_GetMail_4_SQLAlerts') IS NULL
EXEC ('CREATE PROCEDURE dbo.usp_GetMail_4_SQLAlerts AS SELECT 1 AS DummyToBeReplace;');
GO
ALTER PROCEDURE [dbo].[usp_GetMail_4_SQLAlerts] (
@p_Option VARCHAR(50) = 'JobBlockers'
,@p_JobName VARCHAR(255) = 'DBA Log Walk - Restore Staging as Staging'
,@p_Verbose BIT = 0
,@p_DefaultHTMLStyle VARCHAR(100) = 'GreenBackgroundHeader'
,@p_recipients VARCHAR(255) = NULL
)
AS
BEGIN
/* Created By: Ajay Dwivedi
Version: v1.0
Purpose: 29-Apr-2019 - This procedure accepts category for mailer, and send mail for SQLAlerts
*/
SET NOCOUNT ON;
IF @p_Verbose = 1
PRINT 'Declaring Variables';
DECLARE @mailHTML NVARCHAR(MAX) ;
DECLARE @subject VARCHAR(200);
DECLARE @tableName VARCHAR(125);
DECLARE @columnList4TableHeader VARCHAR(MAX);
DECLARE @columnList4TableData VARCHAR(MAX);
DECLARE @cssStyle_GreenBackgroundHeader VARCHAR(MAX);
DECLARE @htmlBody VARCHAR(MAX);
DECLARE @sqlString VARCHAR(MAX);
DECLARE @data4TableData TABLE ( TableData VARCHAR(MAX) );
DECLARE @queryFilter VARCHAR(2000);
IF @p_Verbose = 1
PRINT 'Set value for @tableName';
IF (@p_Option = 'JobBlockers')
BEGIN
SET @tableName = 'dbo.JobBlockers';
--SET @queryFilter = ' AND UsedSpacePercent > 80 ';
END
IF @p_Verbose = 1
BEGIN
PRINT CHAR(13)+CHAR(10)+'Value for @tableName = '+ISNULL(@tableName,'<<NULL>>');
PRINT CHAR(13)+CHAR(10)+'Value for @queryFilter = '+ISNULL(@queryFilter,'<<NULL>>');
END
IF @p_Verbose = 1
PRINT 'Set value for @columnList4TableHeader';
-- Get table headers <th> data for Table <table>
SELECT @columnList4TableHeader = COALESCE(@columnList4TableHeader ,'') + ('<th>'+COLUMN_NAME+'</th>'+CHAR(13)+CHAR(10))
FROM INFORMATION_SCHEMA.COLUMNS as c
WHERE TABLE_SCHEMA+'.'+c.TABLE_NAME = @tableName
AND c.COLUMN_NAME NOT IN ('ID');
IF @p_Verbose = 1
PRINT CHAR(13)+CHAR(10)+'Value for @columnList4TableHeader = '+ISNULL(@columnList4TableHeader,'<<NULL>>');
IF @p_Verbose = 1
PRINT 'Set value for @columnList4TableData';
-- Get row (tr) data for Table <table>
SELECT @columnList4TableData = COALESCE(@columnList4TableData+', '''','+CHAR(13)+CHAR(10) ,'') +
('td = '+CASE WHEN COLUMN_NAME = 'BLOCKING_TREE' THEN 'LEFT(ISNULL('+COLUMN_NAME+','' ''),150)'
WHEN DATA_TYPE = 'xml' THEN 'ISNULL(LEFT(CAST('+COLUMN_NAME+' AS varchar(max)),150),'' '')'
WHEN DATA_TYPE NOT LIKE '%char' AND IS_NULLABLE = 'YES' THEN 'ISNULL(CAST('+COLUMN_NAME+' AS varchar(125)),'' '')'
WHEN DATA_TYPE NOT LIKE '%char' THEN 'CAST('+COLUMN_NAME+' AS VARCHAR(125))'
WHEN IS_NULLABLE = 'YES' THEN 'ISNULL('+COLUMN_NAME+','' '')'
ELSE COLUMN_NAME
END)
FROM INFORMATION_SCHEMA.COLUMNS as c
WHERE TABLE_SCHEMA+'.'+c.TABLE_NAME = @tableName
AND c.COLUMN_NAME NOT IN ('ID');
IF @p_Verbose = 1
BEGIN
PRINT CHAR(13)+CHAR(10)+'Value for @columnList4TableData = '+ISNULL(@columnList4TableData,'<<NULL>>');
END
SET @sqlString = N'
SELECT CAST ( ( SELECT '+@columnList4TableData+'
FROM '+@tableName+'
WHERE 1 = 1 '+ISNULL(@queryFilter,'')+'
FOR XML PATH(''tr''), TYPE
) AS NVARCHAR(MAX) )';
IF @p_Verbose = 1
BEGIN
PRINT CHAR(13)+CHAR(10)+'Evaluating value for @sqlString = '+CHAR(13)+CHAR(10)+ISNULL(@sqlString,'<<NULL>>');
PRINT CHAR(13)+CHAR(10)+'Now populating table @data4TableData';
END
INSERT @data4TableData
EXEC (@sqlString);
SELECT @columnList4TableData = TableData FROM @data4TableData;
IF @p_Verbose = 1
BEGIN
PRINT 'Table @data4TableData has been populated using @sqlString';
SELECT 'SELECT * FROM @data4TableData' AS RunningQuery, * FROM @data4TableData;
PRINT CHAR(13)+CHAR(10)+'Value for @columnList4TableData has been reset to '+CHAR(13)+CHAR(10)+ISNULL(@columnList4TableData,'<<NULL>>');
END
-- If no data to share on Mail, then return
IF NOT EXISTS (SELECT * FROM @data4TableData as d WHERE d.TableData IS NOT NULL)
BEGIN
IF @p_Verbose = 1
PRINT 'No Data to share on Mail. Value of @data4TableData is null.';
RETURN
END
IF @p_JobName IS NOT NULL AND @p_Option = 'JobBlockers'
SET @subject = QUOTENAME(@p_JobName) + ' - ' + @p_Option;
ELSE IF @subject IS NULL
SET @subject = @p_Option;
IF @p_Verbose = 1
PRINT 'Set value for @subject';
SET @subject = @subject + ' - '+CAST(CAST(GETDATE() AS DATE) AS VARCHAR(20));
IF @p_Verbose = 1
PRINT CHAR(13)+CHAR(10)+'Value for @subject = '+ISNULL(@subject,'<<NULL>>');
IF @p_Verbose = 1
PRINT 'Set value for @cssStyle_GreenBackgroundHeader';
SET @cssStyle_GreenBackgroundHeader = N'
<style>
.GreenBackgroundHeader {
font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
border-collapse: collapse;
width: 100%;
}
.GreenBackgroundHeader td, .GreenBackgroundHeader th {
border: 1px solid #ddd;
padding: 8px;
}
.GreenBackgroundHeader tr:nth-child(even){background-color: #f2f2f2;}
.GreenBackgroundHeader tr:hover {background-color: #ddd;}
.GreenBackgroundHeader th {
padding-top: 12px;
padding-bottom: 12px;
text-align: left;
background-color: #4CAF50;
color: white;
}
</style>';
IF @p_Verbose = 1
PRINT CHAR(13)+CHAR(10)+'Value for @cssStyle_GreenBackgroundHeader = '+ISNULL(@cssStyle_GreenBackgroundHeader,'<<NULL>>');
IF @p_Verbose = 1
PRINT 'Set value for @htmlBody using @subject, @p_DefaultHTMLStyle, @columnList4TableHeader and @columnList4TableData values.';
SET @htmlBody = N'<H1>'+@subject+'</H1>' +
N'<table border="1" class="'+@p_DefaultHTMLStyle+'">' +
N'<tr>'+@columnList4TableHeader+'</tr>' +
+@columnList4TableData+
N'</table>' ;
SET @htmlBody = @htmlBody + '
<p>
<br><br>
Thanks & Regards,<br>
SQL Alerts<br>
-- Alert Coming from SQL Agent Job [DBA Log Walk Alerts]<br>
</p>
';
IF @p_Verbose = 1
PRINT 'Set value for @mailHTML using @cssStyle_GreenBackgroundHeader and @htmlBody values.';
SET @mailHTML = @cssStyle_GreenBackgroundHeader + @htmlBody;
IF (@p_recipients IS NULL)
BEGIN
SET @p_recipients = '[email protected]';
END
EXEC msdb.dbo.sp_send_dbmail
@recipients = @p_recipients,
@subject = @subject,
@body = @mailHTML,
@body_format = 'HTML' ;
END -- Procedure
GO