<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>SQL Monitoring - wiseDATAman</title><link>https://wisedataman.com/tag/sql-monitoring/</link><description>SQL Server &amp; SysAdmin, Blog, Tools &amp; Scripts</description><language>en-gb</language><lastBuildDate>Tue, 13 May 2025 21:52:33 +0000</lastBuildDate><atom:link href="https://wisedataman.com/tag/sql-monitoring/index.xml" rel="self" type="application/rss+xml"/><item><title>T-SQL Tuesday #186 - Managing Agent Jobs</title><link>https://wisedataman.com/t-sql-tuesday-186-managing-agent-jobs/</link><pubDate>Tue, 13 May 2025 21:52:33 +0000</pubDate><guid>https://wisedataman.com/t-sql-tuesday-186-managing-agent-jobs/</guid><description>&lt;figure class="wp-block-image alignleft size-full is-resized is-style-default"&gt;&lt;a href="https://www.flxsql.com/2025/05/06/t-sql-tuesday-186-managing-agent-jobs-invite/"&gt;&lt;img src="https://wisedataman.com/wp-content/uploads/2025/05/image.png" alt="T-SQL Tuesday Logo" class="wp-image-734" style="width:154px;height:auto" loading="lazy"&gt;&lt;/a&gt;&lt;/figure&gt;&#10;&lt;p&gt;For T-SQL Tuesday #186, &lt;a href="https://www.flxsql.com/2025/05/06/t-sql-tuesday-186-managing-agent-jobs-invite/"&gt;Andy Levy asks&lt;/a&gt;, &lt;em&gt;&amp;ldquo;How do you manage and/or monitor your SQL Server Agent jobs?&amp;rdquo;&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;This is a great opportunity for me to discuss how &lt;a href="https://dbadash.com/"&gt;DBA Dash&lt;/a&gt; can help monitor SQL Agent jobs. DBA Dash is a free and &lt;strong&gt;&lt;a href="https://github.com/trimble-oss/dba-dash"&gt;open-source&lt;/a&gt;&lt;/strong&gt; monitoring tool for SQL Server, created by me. It&amp;rsquo;s used to monitor thousands of SQL Server instances within Trimble alone, and it&amp;rsquo;s gaining popularity in the SQL Server community.&lt;/p&gt;&#10;&lt;h2 id="built-in-alerts-for-job-failures"&gt;Built-in alerts for job failures&lt;/h2&gt;&#10;&lt;p&gt;Before we discuss DBA Dash, what can we do within SQL Server without any 3rd party tools?&lt;/p&gt;&#10;&lt;p&gt;SQL Agent jobs have native alert notifications. You can get an email whenever a job fails, succeeds, or completes.&lt;/p&gt;&#10;&lt;figure class="wp-block-image size-full"&gt;&lt;img src="https://wisedataman.com/wp-content/uploads/2025/05/image-1.png" alt="SQL Server agent job alert notification" class="wp-image-735" loading="lazy"&gt;&lt;/figure&gt;&#10;&lt;h3 id="issues-with-built-in-alerts"&gt;Issues with built-in alerts:&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;If a frequently executed job starts failing, this can generate a lot of noise.&lt;br&gt;&#10;&lt;em&gt;A workaround is to set a retry policy and retry interval for your job steps.&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;A lack of a failure notification doesn&amp;rsquo;t mean that everything is in a good state.&lt;br&gt;&#10;&lt;em&gt;You should validate the status of your SQL agent jobs in combination with alerts. Job activity monitor in SSMS could be used for this, but it doesn&amp;rsquo;t scale if you have many SQL instances to monitor.&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;It requires database mail. There are no modern notification channels like Slack, Google chat, PagerDuty etc.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="dba-dash"&gt;DBA Dash&lt;/h2&gt;&#10;&lt;p&gt;DBA Dash includes several useful features to help you monitor your SQL Agent jobs.&lt;/p&gt;&#10;&lt;h3 id="summary-page"&gt;Summary page&lt;/h3&gt;&#10;&lt;p&gt;First up is the summary page. This is a single-page report that can tell you if you have failing jobs across your whole SQL Server estate. It can also tell you if your SQL Server agent is stopped on any of those instances. The summary page includes &lt;strong&gt;many&lt;/strong&gt; other things you should include as part of your &lt;strong&gt;daily checks&lt;/strong&gt;, in addition to monitoring agent jobs.&lt;/p&gt;&#10;&lt;figure class="wp-block-image size-large"&gt;&lt;img src="https://wisedataman.com/wp-content/uploads/2025/05/image-2-1024x549.png" alt="DBA Dash daily checks summary page" class="wp-image-737" loading="lazy"&gt;&lt;/figure&gt;&#10;&lt;p&gt;From the summary page, you can drill down and see specific jobs that are failing across your instances. You can click to view the failed steps and messages.&lt;/p&gt;&#10;&lt;figure class="wp-block-image size-large"&gt;&lt;img src="https://wisedataman.com/wp-content/uploads/2025/05/image-3-1024x266.png" alt="" class="wp-image-738" loading="lazy"&gt;&lt;/figure&gt;&#10;&lt;p&gt;Thresholds and exclusions can be configured at the root, instance or job level.&lt;/p&gt;&#10;&lt;h3 id="alerts"&gt;Alerts&lt;/h3&gt;&#10;&lt;p&gt;DBA Dash has an AgentJob alert rule that you can use for instant notifications. You can target a specific server, a group of servers (using tags), and filter by category and job name. Your notification options currently include Email, Slack, PagerDuty and Webhook (e.g. Google Chat).&lt;/p&gt;&#10;&lt;figure class="wp-block-image size-large"&gt;&lt;img src="https://wisedataman.com/wp-content/uploads/2025/05/image-11-1024x169.png" alt="Slack alert notification" class="wp-image-746" loading="lazy"&gt;&lt;/figure&gt;&#10;&lt;p&gt;This provides more modern notification options over built-in alerts and allows alerts to be configured centrally. You can control when you are notified and by what mechanism, depending on the priority of the alert.&lt;/p&gt;&#10;&lt;h3 id="job-performance"&gt;Job Performance&lt;/h3&gt;&#10;&lt;p&gt;You might also be interested in tracking job performance over time. DBA Dash allows you to do this centrally. The msdb database maintains a history of job execution, but the DBA Dash repository database enables you to store the execution metrics for a long time with minimal storage cost. You can also visualize the job performance over time very easily.&lt;/p&gt;&#10;&lt;figure class="wp-block-image size-large"&gt;&lt;img src="https://wisedataman.com/wp-content/uploads/2025/05/image-4-1024x509.png" alt="SQL Server agent job performance over time" class="wp-image-739" loading="lazy"&gt;&lt;/figure&gt;&#10;&lt;h3 id="timeline"&gt;Timeline&lt;/h3&gt;&#10;&lt;p&gt;The timeline view is a great way to see which jobs ran when and how long they ran for. This is useful to help plan job schedules, among other things.&lt;/p&gt;&#10;&lt;figure class="wp-block-image size-large"&gt;&lt;img src="https://wisedataman.com/wp-content/uploads/2025/05/image-5-1024x294.png" alt="SQL Server agent job timeline view" class="wp-image-740" loading="lazy"&gt;&lt;/figure&gt;&#10;&lt;h3 id="running-jobs"&gt;Running Jobs&lt;/h3&gt;&#10;&lt;p&gt;Want to know what jobs are running right now across all your instances?&lt;/p&gt;&#10;&lt;figure class="wp-block-image size-large"&gt;&lt;img src="https://wisedataman.com/wp-content/uploads/2025/05/image-6-1024x195.png" alt="" class="wp-image-741" loading="lazy"&gt;&lt;/figure&gt;&#10;&lt;h3 id="schema-tracking"&gt;Schema Tracking&lt;/h3&gt;&#10;&lt;p&gt;DBA Dash scripts your SQL agent jobs, tracking when changes occur. This can be used to help answer what changed when and provides access to previous versions of jobs, should you need to roll back.&lt;/p&gt;&#10;&lt;p&gt;If you can source control your SQL agent jobs, that is also a great idea. DBA Dash can complement that.&lt;/p&gt;&#10;&lt;figure class="wp-block-image size-large"&gt;&lt;img src="https://wisedataman.com/wp-content/uploads/2025/05/image-7-1024x556.png" alt="SQL Agent job schema tracking" class="wp-image-742" loading="lazy"&gt;&lt;/figure&gt;&#10;&lt;p&gt;This feature is also used to provide a SQL agent job DIFF tool so you can compare jobs between SQL instances.&lt;/p&gt;&#10;&lt;figure class="wp-block-image size-large"&gt;&lt;img src="https://wisedataman.com/wp-content/uploads/2025/05/image-8-1024x665.png" alt="SQL Server agent job compare servers" class="wp-image-743" loading="lazy"&gt;&lt;/figure&gt;&#10;&lt;h3 id="more-to-come"&gt;More to come&lt;/h3&gt;&#10;&lt;p&gt;As I&amp;rsquo;m writing this, I&amp;rsquo;m working on a Job Info page to provide job details on a single page (Steps, schedules, and other metadata). I&amp;rsquo;m using ScriptDom to parse this information, and with the DDL tracking, I can display this info for past versions of a job. I can also use this to display an alternative DIFF format.&lt;/p&gt;&#10;&lt;figure class="wp-block-image size-large"&gt;&lt;img src="https://wisedataman.com/wp-content/uploads/2025/05/image-9-1024x676.png" alt="SQL agent job info compare" class="wp-image-744" loading="lazy"&gt;&lt;/figure&gt;&#10;&lt;p&gt;DBA Dash includes a Running Query capture for performance monitoring (similar to sp_WhoIsActive or sp_BlitzWho). This will show you the job name if a query is associated with a running job. In the next version of DBA Dash, this will be a link, providing you with immediate access to the job details and execution stats.&lt;/p&gt;&#10;&lt;figure class="wp-block-image size-large"&gt;&lt;img src="https://wisedataman.com/wp-content/uploads/2025/05/image-10-1024x950.png" alt="SQL Server agent job info from running queries." class="wp-image-745" loading="lazy"&gt;&lt;/figure&gt;&#10;&lt;p&gt;&lt;del&gt;These features should make their way into the next version of DBA Dash, 3.23. Or they might already be available by the time you read this.&lt;/del&gt;&lt;/p&gt;&#10;&lt;p&gt;Edit: 3.23 is here now! 🚀&lt;/p&gt;&#10;&lt;p&gt;Thanks for reading!&lt;/p&gt;&#10;</description></item><item><title>DBA Dash – What’s new in 2.22.0? 🎉</title><link>https://wisedataman.com/dba-dash-whats-new-in-2-22-0/</link><pubDate>Thu, 08 Sep 2022 10:34:52 +0000</pubDate><guid>https://wisedataman.com/dba-dash-whats-new-in-2-22-0/</guid><description>&lt;h2 id="identity-columns-collection"&gt;Identity Columns collection&lt;/h2&gt;&#10;&lt;p&gt;If your table runs out of identity values, you might see an error message similar to the one below:&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Msg 8115, Level 16, State 1, Line 7&lt;br&gt;&#10;Arithmetic overflow error converting IDENTITY to data type int.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;DBA Dash now has monitoring for identity values. You can see when you are about to run out of identity values which allows you time to plan and fix these problems &lt;strong&gt;before&lt;/strong&gt; they cause errors in your database.&lt;/p&gt;&#10;&lt;figure class="wp-block-image size-large"&gt;&lt;img src="https://wisedataman.com/wp-content/uploads/2022/09/IdentityColumnsSummary-1024x200.png" alt="" class="wp-image-654" loading="lazy"&gt;&lt;figcaption&gt;Identity Columns on DBA Dash Summary page&lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;figure class="wp-block-image size-large"&gt;&lt;img src="https://wisedataman.com/wp-content/uploads/2022/09/IdentityColumns-1024x106.png" alt="" class="wp-image-655" loading="lazy"&gt;&lt;figcaption&gt;Identity Columns drilldown&lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/trimble-oss/dba-dash/blob/main/Docs/IdentityColumns.md"&gt;More information here.&lt;/a&gt;&lt;/p&gt;&#10;&lt;h2 id="backup-compression-algorithms-for-sql-2022"&gt;Backup Compression Algorithms for SQL 2022&lt;/h2&gt;&#10;&lt;p&gt;SQL 2022 has the option to use Intel QAT backup compression. In software mode this is supported on standard and enterprise editions. It&amp;rsquo;s significantly faster, produces higher levels of compression and uses less resources. Hardware mode is just supported on enterprise edition and can significantly offload the CPU cost of compressing your backups.&lt;/p&gt;&#10;&lt;p&gt;Glenn Berry has some good articles on this &lt;a href="https://glennsqlperformance.com/2022/08/25/how-to-enable-intel-qat-backup-compression-in-sql-server-2022/"&gt;here&lt;/a&gt; and &lt;a href="https://glennsqlperformance.com/2022/08/28/some-intel-qat-backup-compression-results/"&gt;here&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;So what&amp;rsquo;s this got to do with DBA Dash? &lt;strong&gt;DBA Dash now captures the compression algorithm used from msdb.dbo.backupset for your latest backups&lt;/strong&gt;. You can now where QAT_DEFLATE compression is in use.&lt;/p&gt;&#10;&lt;figure class="wp-block-image size-large"&gt;&lt;img src="https://wisedataman.com/wp-content/uploads/2022/09/DBADashBackupCompression-1024x369.png" alt="" class="wp-image-656" loading="lazy"&gt;&lt;figcaption&gt;New columns added to capture compression algorithm used for last backup&lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;p&gt;DBA Dash also tracks sys.configurations settings in use across all your SQL instances, including the new configuration options used to enable QAT_DEFLATE compression. You can see the configuration setting in use and also track when settings have been changed.&lt;/p&gt;&#10;&lt;figure class="wp-block-image size-large"&gt;&lt;img src="https://wisedataman.com/wp-content/uploads/2022/09/DBADashConfigurationBackupCompression-1024x348.png" alt="" class="wp-image-657" loading="lazy"&gt;&lt;figcaption&gt;'#Tracking changes to sys.configurations&lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;h2 id="download"&gt;Download&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/trimble-oss/dba-dash/releases"&gt;Download Now&lt;/a&gt;&lt;/p&gt;&#10;</description></item><item><title>DBA Dash - What's new in 2.21.0? 🚀</title><link>https://wisedataman.com/dba-dash-whats-new-in-2-21-0/</link><pubDate>Tue, 09 Aug 2022 21:16:25 +0000</pubDate><guid>https://wisedataman.com/dba-dash-whats-new-in-2-21-0/</guid><description>&lt;h2 id="intro"&gt;Intro&lt;/h2&gt;&#10;&lt;p&gt;The first public release of DBA Dash was in January 2022 and version 2.21.0 is the 24th release.🎉 A lot has changed with many new features added as well as bug fixes. I haven&amp;rsquo;t really blogged much about the changes, but I thought it might be good to capture what its new for significant releases. So here is what is new and cool in 2.21.0!&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Note:&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;You can see the full change log &lt;a href="https://github.com/trimble-oss/dba-dash/releases"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&#10;&lt;h2 id="metrics-tab"&gt;Metrics tab&lt;/h2&gt;&#10;&lt;p&gt;The metrics tab was previously a wall of numbers - the Max, Min, Avg, Total &amp;amp; Current value of all the collected performance counters. At the click of a button you could see a chart for any counter over time for the selected period. It was limited to showing 1 chart at a time.&lt;/p&gt;&#10;&lt;p&gt;In 2.17.0 it was possible to configure threshold values for your counters - improving on the wall of numbers by highlighting counters that need your attention.&lt;/p&gt;&#10;&lt;p&gt;Now in 2.21.0 when you click &lt;strong&gt;view&lt;/strong&gt; to view a chart for a particular counter, it adds a new chart. You can view charts for multiple counters simultaneously. Also, you can add other charts that are not os performance counters - CPU, Blocking, IO, Object Execution and Waits. This provides additional context for your performance counters. You can re-order the charts and remove them at the click of a button.&lt;/p&gt;&#10;&lt;p&gt;Once you&amp;rsquo;ve created a useful dashboard you can save and re-load it at the click of a button. You can save the view for yourself or share it with your team.&lt;/p&gt;&#10;&lt;p&gt;See it in action &lt;a href="https://wisedataman.com/wp-content/uploads/2022/08/DBADash2.21.0.gif"&gt;here:&lt;/a&gt;&lt;/p&gt;&#10;&lt;figure class="wp-block-image size-full"&gt;&lt;a href="https://wisedataman.com/wp-content/uploads/2022/08/DBADash2.21.0.gif"&gt;&lt;img src="https://wisedataman.com/wp-content/uploads/2022/08/DBADash2.21.0.gif" alt="DBA Dash Metrics tab" class="wp-image-647" title="DBA Dash Metrics" loading="lazy"&gt;&lt;/a&gt;&lt;figcaption&gt;DBA Dash - Metrics tab&lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;p&gt;&lt;em&gt;&lt;strong&gt;Tip:&lt;/strong&gt; You can easily configure which performance counters are collected. Also, you can collect any metric you like that can be queried with T-SQL. See &lt;a href="https://github.com/trimble-oss/dba-dash/blob/main/Docs/OSPerformanceCounters.md"&gt;here&lt;/a&gt; for details on how to customize the collection.&lt;/em&gt;&lt;/p&gt;&#10;&lt;h2 id="performance-summary-tab"&gt;Performance Summary tab&lt;/h2&gt;&#10;&lt;p&gt;The performance summary tab now has saved views the same as the metrics tab. You could save the layout previously but it wasn&amp;rsquo;t possible to save multiple versions or to share those with the rest of the team.&lt;/p&gt;&#10;</description></item><item><title>DBA Dash vs sp_WhoIsActive / spBlitzWho</title><link>https://wisedataman.com/dba-dash-vs-sp_whoisactive/</link><pubDate>Sun, 06 Feb 2022 22:12:36 +0000</pubDate><guid>https://wisedataman.com/dba-dash-vs-sp_whoisactive/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="http://whoisactive.com/"&gt;sp_WhoIsActive&lt;/a&gt; and &lt;a href="https://www.brentozar.com/first-aid/sp_blitzwho/"&gt;sp_BlitzWho&lt;/a&gt; are popular stored procedures created by the database community. They both capture queries currently running on your server. If you are a seasoned DBA it&amp;rsquo;s likely you have come across one or both of these tools. sp_WhoIsActive in particular has been around for a &lt;strong&gt;very long time&lt;/strong&gt;, deployed to many, many thousands of servers. It&amp;rsquo;s helped me solve countless performance issues. Shout out to &lt;a href="http://dataeducation.com/about/"&gt;Adam Machanic&lt;/a&gt; who created the tool - Thank you!&lt;/p&gt;&#10;&lt;p&gt;The &lt;a href="https://www.brentozar.com/"&gt;Brent Ozar&lt;/a&gt; team created sp_BlitzWho due to licensing issues distributing sp_WhoIsActive. The licensing issues are no longer a concern as both tools are now open source and can be freely distributed. sp_BlitzWho still has a more permissive license but the difference isn&amp;rsquo;t likely to matter to most people. Both work great. Each has unique selling points. Include them on all your SQL Server deployments! The excellent &lt;a href="https://dbatools.io/"&gt;dbatools&lt;/a&gt; can help with that.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/trimble-oss/dba-dash"&gt;DBA Dash&lt;/a&gt; isn&amp;rsquo;t a stored procedure for showing active queries - it&amp;rsquo;s a full monitoring tool with a Windows app front end. So this is a bit of a weird comparison. It does capture running queries though which is where we can draw some comparisons.&lt;/p&gt;&#10;&lt;h2 id="re-inventing-the-wheel"&gt;Re-inventing the Wheel&lt;/h2&gt;&#10;&lt;p&gt;While developing DBA Dash I did consider just embedding sp_BlitzWho or sp_WhoIsActive rather than re-invent the wheel. Licensing was maybe a concern for sp_WhoIsActive but I had other reasons for creating my own solution. I wanted a solution &lt;strong&gt;designed specifically for regular collection.&lt;/strong&gt; sp_BlitzWho and sp_WhoIsActive can both log to a table. But they were designed for interactive use in SSMS.&lt;/p&gt;&#10;&lt;h2 id="performance"&gt;Performance&lt;/h2&gt;&#10;&lt;p&gt;The goal for DBA Dash was to limit the overhead of query collection. Also, I did not need or want the data to be formatted for human consumption on collection. The numbers below show a performance comparison. I&amp;rsquo;m using the defaults for each and averaging over 10 executions. 12 active queries were running for this test.&lt;/p&gt;&#10;&lt;figure class="wp-block-table"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Tool&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Avg CPU (ms)&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Avg Duration (ms)&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;sp_WhoIsActive&lt;/td&gt;&lt;td&gt;159&lt;/td&gt;&lt;td&gt;166&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;sp_BlitzWho&lt;/td&gt;&lt;td&gt;231&lt;/td&gt;&lt;td&gt;241&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;DBA Dash (with session waits)&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;15&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;figcaption&gt;Performance Tests&lt;/figcaption&gt;&lt;/figure&gt;&#10;&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; I don&amp;rsquo;t worry about the overhead of running any of these tools interactively. Also, if you want to log the output to a table at regular intervals it&amp;rsquo;s not likely to hurt the performance of your server. Still, for regular monitoring, it&amp;rsquo;s good to keep overhead as low as possible.&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;If you want to test this for yourself, the capture query for DBA Dash is &lt;a href="https://github.com/trimble-oss/dba-dash/blob/main/DBADash/SQL/SQLRunningQueries.sql"&gt;here&lt;/a&gt;. Confession time - this &lt;strong&gt;isn&amp;rsquo;t a fair fight&lt;/strong&gt;. I&amp;rsquo;m not collecting query text or query plans. sp_BlizWho collects query plans by default so it&amp;rsquo;s at a disadvantage - the tools are not all doing the same thing. Also, the performance differences between these tools will vary based on several other factors.&lt;/p&gt;&#10;&lt;h3 id="so-how-does-dba-dash-show-query-text"&gt;So how does DBA Dash show query text?&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Takes a distinct list of sql_handles from the running query capture&lt;/li&gt;&#10;&lt;li&gt;Collect text associated with those handles (if required).&lt;/li&gt;&#10;&lt;li&gt;Cache the handles.&lt;/li&gt;&#10;&lt;li&gt;Ignore the handles we&amp;rsquo;ve already captured on subsequent collections.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Query plan capture features a similar optimization. Also, DBA Dash doesn&amp;rsquo;t need to do anything with the formatting of the data for human consumption - at least not on collection.&lt;/p&gt;&#10;&lt;p&gt;Query text and query plans are stored in separate tables. Not duplicated by row. DBA Dash can also take care of data retention - clearing out old data efficiently with some partition switching.&lt;/p&gt;&#10;&lt;p&gt;This isn&amp;rsquo;t just about efficient data collection. DBA Dash has a custom GUI and isn&amp;rsquo;t bound by the same constraints as sp_WhoIsActive and sp_BlitzWho. This allows us to do some interesting things.&lt;/p&gt;&#10;&lt;h2 id="summary-data"&gt;Summary Data&lt;/h2&gt;&#10;&lt;p&gt;At the top level, we see the summary of the last running queries snapshot for each instance. In this case, we can see some serious blocking going on with instance DASH2019.&lt;/p&gt;&#10;&lt;figure class="wp-block-image size-large"&gt;&lt;img src="https://wisedataman.com/wp-content/uploads/2022/02/image-1024x210.png" alt="" class="wp-image-565" loading="lazy"&gt;&lt;/figure&gt;&#10;&lt;p&gt;From there we can drill down to the DASH2019 instance and see a list of recent snapshots. We can also go back in time to any custom date range and see a list of the snapshots collected.&lt;/p&gt;&#10;&lt;figure class="wp-block-image size-full"&gt;&lt;img src="https://wisedataman.com/wp-content/uploads/2022/02/image-1.png" alt="" class="wp-image-566" loading="lazy"&gt;&lt;/figure&gt;&#10;&lt;p&gt;Use the summary data above to determine which snapshots are most interesting. Then drill down to the individual snapshots themselves:&lt;/p&gt;&#10;&lt;p&gt;[&lt;/p&gt;&#10;&lt;figure class="wp-block-image size-large"&gt;&lt;img src="https://wisedataman.com/wp-content/uploads/2022/02/image-2-1024x179.png" alt="" class="wp-image-567" loading="lazy"&gt;&lt;/figure&gt;&#10;&lt;p&gt;](/wp-content/uploads/2022/02/image-2.png)&lt;/p&gt;&#10;&lt;h2 id="blocking"&gt;Blocking&lt;/h2&gt;&#10;&lt;figure class="wp-block-image size-full"&gt;&lt;img src="https://wisedataman.com/wp-content/uploads/2022/02/image-3.png" alt="" class="wp-image-581" loading="lazy"&gt;&lt;/figure&gt;&#10;&lt;p&gt;In the screenshot above I&amp;rsquo;ve zoomed into the blocking section of the report. DBA Dash highlights the sessions blocked in the &amp;ldquo;Blocking Session ID&amp;rdquo; column. In some cases, there will be long blocking chains. This can make it difficult to work out which is the root blocker by looking at the blocking session id and traversing the blocking chain manually. With sp_WhoIsActive you can pass @find_block_leaders=1 to make this easier which gives you a blocked session count.&lt;/p&gt;&#10;&lt;p&gt;With DBA Dash you can just look at the &amp;ldquo;Blocking Hierarchy&amp;rdquo; column. Take session 64. This is blocked by session 79 and we have a hierarchy of &amp;ldquo;90 \ 79&amp;rdquo;. Session 79 is blocking the current session 64. Session 90 is blocking session 79 and is our root blocker. The &amp;ldquo;Root Blocker&amp;rdquo; column also identifies which sessions are root blockers. You can filter to show just the root blockers at the click of a button.&lt;/p&gt;&#10;&lt;p&gt;The &amp;ldquo;Blocked Count&amp;rdquo; column shows how many queries are blocked directly by a session. You also have a &amp;ldquo;Blocked Count Recursive&amp;rdquo; column that shows you a total count of sessions blocked by the query (directly/indirectly). The counts are also clickable - allowing you to navigate the blocking chain interactively.&lt;/p&gt;&#10;&lt;h3 id="so-whats-actually-going-on-in-this-snapshot"&gt;So what&amp;rsquo;s actually going on in this snapshot?&lt;/h3&gt;&#10;&lt;p&gt;DBA Dash identifies session 90 as the root blocker. Session 90 isn&amp;rsquo;t blocked or waiting on anything. The CPU time and reads are very small. The status column is &amp;ldquo;sleeping&amp;rdquo; and we should pay close attention to this. A sleeping session is dormant - waiting for input from the app. This is a problem if the session has an open transaction - holding locks needed by other sessions. DBA Dash gives us the user, hostname, application name along with the query text that will assist in tracking this down.&lt;/p&gt;&#10;&lt;p&gt;The root cause of this issue is an update statement that ran from SSMS. It had a BEGIN TRAN but didn&amp;rsquo;t issue a COMMIT or ROLLBACK. This left the transaction open, holding locks that caused the blocking.&lt;/p&gt;&#10;&lt;p&gt;Sleeping sessions causing blocking are something to watch out for. It might indicate problems that need to be fixed in the app. e.g. Not using the &amp;ldquo;using&amp;rdquo; pattern, doing slow work in the middle of the transaction like calling a web service.&lt;/p&gt;&#10;&lt;h2 id="waits"&gt;Waits&lt;/h2&gt;&#10;&lt;p&gt;DBA Dash shows what queries are currently waiting on. It also captures the wait resource and parses the wait resource to make it easier to decipher. Session level waits are also available in DBA Dash (and sp_BlitzWho). DBA Dash extends this by providing a clickable link that will show the session level waits in table format with more detail.&lt;/p&gt;&#10;&lt;h2 id="text"&gt;Text&lt;/h2&gt;&#10;&lt;figure class="wp-block-image size-full"&gt;&lt;img src="https://wisedataman.com/wp-content/uploads/2022/02/image-4.png" alt="" class="wp-image-582" loading="lazy"&gt;&lt;/figure&gt;&#10;&lt;p&gt;DBA Dash gives you the statement text and the full query text associated with the SQL handle. Just click the links in the grid to see the text formatted in a new window.&lt;/p&gt;&#10;&lt;h2 id="plans"&gt;Plans&lt;/h2&gt;&#10;&lt;figure class="wp-block-image size-full"&gt;&lt;img src="https://wisedataman.com/wp-content/uploads/2022/02/image-5.png" alt="" class="wp-image-583" loading="lazy"&gt;&lt;/figure&gt;&#10;&lt;p&gt;DBA Dash can show you query plans at the click of a button. Configure this using the service configuration tool. The collection process is optimized the same as for query text. Also, you can reduce the cost of collection further with plan collection thresholds.&lt;/p&gt;&#10;&lt;p&gt;A query plan tells you exactly how SQL Server was attempting to process the query. It also gives you the parameters that were used to compile the query plan.&lt;/p&gt;&#10;&lt;h2 id="batch-completed--rpc-completed"&gt;Batch Completed / RPC Completed&lt;/h2&gt;&#10;&lt;figure class="wp-block-image size-large"&gt;&lt;img src="https://wisedataman.com/wp-content/uploads/2022/02/image-6-1024x455.png" alt="" class="wp-image-584" loading="lazy"&gt;&lt;/figure&gt;&#10;&lt;p&gt;Having the batch text and statement is great. For a typical RPC call, we can see the current statement along with the text of the associated stored procedure (or batch). What&amp;rsquo;s missing are the parameter values passed in from the client application. Unfortunately, we can&amp;rsquo;t get this by querying the DMVs. DBA Dash has a trick up its sleeve though. We can enable the capture of slow queries which creates an extended event session to capture queries that take longer than 1 second to run (configurable).&lt;/p&gt;&#10;&lt;p&gt;What&amp;rsquo;s cool is that you can click a session ID in running queries and see the associated RPC/batch completed event. This gives you the metrics associated with the completed execution and also the query text with the parameter values. Having the parameter values is useful when trying to reproduce and diagnose performance issues.&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;Note: The associated RPC/batch completed event is only available if the query has completed. It also needs to meet the threshold for collection. DBA Dash collects this data every 1min by default which adds additional delay. For the most recent snapshot, you might need to wait before the RPC/batch completed event is available.&lt;/em&gt;&lt;/p&gt;&#10;&lt;h3 id="full-duplex"&gt;Full Duplex&lt;/h3&gt;&#10;&lt;p&gt;The link between running queries and RPC/batch completed is two-way. The Slow Queries tab shows you the RPC/batch completed events captured from the extended events session. From here you can click the session id and see all the running queries snapshots captured for that session while the query was running. Having access to the running queries snapshots can help answer questions about why a query was slow.&lt;br&gt;&#10;e.g. Was it blocked?&lt;br&gt;&#10;What was it waiting for?&lt;br&gt;&#10;What was the query plan used?&lt;br&gt;&#10;What statement was running?&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;Note: For queries with shorter execution times you might not have any data as running queries is captured every 1min by default.&lt;/em&gt;&lt;/p&gt;&#10;&lt;h2 id="grouping-and-export"&gt;Grouping and Export&lt;/h2&gt;&#10;&lt;figure class="wp-block-image size-large"&gt;&lt;img src="https://wisedataman.com/wp-content/uploads/2022/02/image-7-1024x137.png" alt="" class="wp-image-585" loading="lazy"&gt;&lt;/figure&gt;&#10;&lt;p&gt;You can group the running query capture in DBA Dash with the click of a button. For example, you might want to count the number of running queries by application, query hash, hostname&amp;hellip;.lots of options here. From there you can drill down to see the queries associated with your selected group value.&lt;/p&gt;&#10;&lt;figure class="wp-block-image size-full"&gt;&lt;img src="https://wisedataman.com/wp-content/uploads/2022/02/image-8.png" alt="" class="wp-image-586" loading="lazy"&gt;&lt;/figure&gt;&#10;&lt;p&gt;Exporting the data to Excel is also just a click away.&lt;/p&gt;&#10;&lt;h2 id="not-a-gui-person"&gt;Not a GUI person?&lt;/h2&gt;&#10;&lt;p&gt;The captured running query data is available in the DBA Dash repository database for you to query manually if required. I&amp;rsquo;d recommend using the &lt;a href="https://github.com/trimble-oss/dba-dash/blob/main/DBADashDB/dbo/Views/RunningQueriesInfo.sql"&gt;dbo.RunningQueriesInfo&lt;/a&gt; view. The application calls &lt;a href="https://github.com/trimble-oss/dba-dash/blob/main/DBADashDB/dbo/Stored%20Procedures/RunningQueries_Get.sql"&gt;dbo.RunningQueries_Get&lt;/a&gt; to return a specific snapshot (which uses the view).&lt;/p&gt;&#10;&lt;h2 id="wrap-up"&gt;Wrap up&lt;/h2&gt;&#10;&lt;p&gt;Running queries capture is just a small (but interesting) part of what DBA Dash can do. There is a lot more that the tool can do - pair DBA Dash with query store and you have a lot of bases covered.&lt;/p&gt;&#10;&lt;p&gt;sp_WhoIsActive and sp_BlitzWho still have a place in my toolbox. I use them often. They are great tools and DBA Dash doesn&amp;rsquo;t replace them. I&amp;rsquo;m, running these tools interactively where DBA Dash is capturing valuable performance data round the clock for both current and retrospective analysis.&lt;/p&gt;&#10;&lt;p&gt;There is a lot of value in running a quick command in SSMS and having the results available immediately - in the same tool. With DBA Dash you have to wait for the next scheduled collection which is every 1min by default. Also, not everyone will want a full monitoring tool just to capture running queries. sp_WhoIsActive and sp_BitzWho both have their unique selling points and DBA Dash doesn&amp;rsquo;t replicate all their features and functionality.&lt;/p&gt;&#10;&lt;p&gt;If you haven&amp;rsquo;t tried DBA Dash, it&amp;rsquo;s a free monitoring tool for SQL Server that I created. My employer &lt;a href="https://www.trimble.com/"&gt;Trimble&lt;/a&gt; has allowed me to share the tool open source and it&amp;rsquo;s available on GitHub &lt;a href="https://github.com/trimble-oss/dba-dash"&gt;here&lt;/a&gt;. sp_WhoIsActive and sp_BlitzWho are also open source. Give them a try today.&lt;/p&gt;&#10;</description></item><item><title>DBA Daily Checks Email Report</title><link>https://wisedataman.com/dba-daily-checks-email-report/</link><pubDate>Mon, 13 Jul 2009 12:00:37 +0000</pubDate><guid>https://wisedataman.com/dba-daily-checks-email-report/</guid><description>&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: This was my original solution to automate the DBA Checks process. I don&amp;rsquo;t recommend people use this solution as it doesn&amp;rsquo;t scale well to a larger number of servers and the CLR function used to get drive space requires the TRUSTWORTHY property to be enabled which can be a potential security risk.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;I recommend people use &lt;a href="https://wisedataman.com/dba-dash"&gt;DBA Dash&lt;/a&gt; for daily DBA Checks.&lt;/strong&gt; This gives you a central dashboard so you can see the status of all your SQL instances on a single page with drill downs for more detailed information.&lt;/p&gt;&#10;&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;&#10;&lt;p&gt;In addition to alerts I recommend running daily checks to validate that backups are running as expected, servers have sufficient disk space and agent jobs are running successfully.  Although alerts provide immediate notification that there is an issue you can&amp;rsquo;t assume that everything is OK because you haven&amp;rsquo;t received an email notification.&lt;/p&gt;&#10;&lt;p&gt;For example, an email alert might get caught by a spam filter or matched by a rule in your email system that moves it to a different folder. It&amp;rsquo;s also possible there was a problem sending the notification email. If you are not careful with how you configure alerts you can easily get spammed by a large number of alert emails and important notifications could be lost in this flood.&lt;/p&gt;&#10;&lt;p&gt;You might not get a failed backup job notification if your backup job never ran - maybe the job got disabled or the SQL Agent wasn&amp;rsquo;t running. These are some of the reasons I recommend daily checks.&lt;/p&gt;&#10;&lt;p&gt;The solution in this post has each SQL Server send a report via email that runs various checks and highlights any issues. It&amp;rsquo;s a solution I used when I managed a smaller number of servers but as the number of instances I managed increased it became unwieldy. Depending on the number of serves you manage you might find it useful.&lt;/p&gt;&#10;&lt;p&gt;I now use a different solution that collects data from multiple servers in a central repository. This allows me to have a single dashboard that highlights problems across multiple servers instead of having to check individual reports for each server. I hope to share my new method at some point.&lt;/p&gt;&#10;&lt;h2 id="report-sample"&gt;Report Sample&lt;/h2&gt;&#10;&lt;p&gt;The image below is a sample report that was generated from a test instance of SQL Server. &lt;/p&gt;&#10;&lt;figure class="wp-block-image size-large"&gt;&lt;img src="https://wisedataman.com/wp-content/uploads/2020/05/DBAChecks.png" alt="DBA Checks HTML Report Sample" class="wp-image-126" loading="lazy"&gt;&lt;/figure&gt;&#10;&lt;h2 id="compatibility"&gt;Compatibility&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;SQL Server 2005 (SP3)&lt;br&gt;&#10;There seems to be a bug in earlier builds related to attachments in email messages.  You might get an error similar to this one:&lt;br&gt;&#10;_Exception happened when running extended stored procedure &amp;lsquo;xp_sysmail_format_query&amp;rsquo; in the library &amp;lsquo;xpstar90.dll&amp;rsquo;. SQL Server is terminating process 62. Exception type: Win32 exception; Exception code: 0xc0000005.&lt;br&gt;&#10;_You can fix this by upgrading to the latest service pack or removing the code that adds the error log attachment to the email.  Restarting the SQL Server Agent can also provide a temporary fix for this issue, but the problem is likely to re-occur.&lt;/li&gt;&#10;&lt;li&gt;SQL Server 2008&lt;/li&gt;&#10;&lt;li&gt;SQL Server 2008 R2&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="installation-instructions"&gt;Installation Instructions&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Create a database for DBA related tasks if one doesn&amp;rsquo;t already exist.&lt;/li&gt;&#10;&lt;li&gt;Install SQLIO_fnGetDrives() CLR function.  &lt;a href="https://wisedataman.com/sql-server-clr-io-utility"&gt;See here&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;Install DBA Checks stored procedures.  (Script below)&lt;/li&gt;&#10;&lt;li&gt;Make sure you have configured database mail on the SQL Server instance.&lt;/li&gt;&#10;&lt;li&gt;Create a SQL Server Agent Job to run the dbo.DBAChecks stored procedure.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="code-block"&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SET ANSI_NULLS ON&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GO&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SET QUOTED_IDENTIFIER ON&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GO&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CREATE PROC [dbo].[DBAChecks_Backups](&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;@HTML varchar(max) OUT,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;@FullWarningThresholdDays int,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;@DiffWarningThresholdDays int,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;@TranWarningThresHoldHours int&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SET NOCOUNT ON&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/* &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;Returns HTML for &amp;#34;Backups&amp;#34; section of DBA Checks Report&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;*/ &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;declare @Server varchar(40)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set @server = CONVERT(varchar(35), SERVERPROPERTY(&amp;#39;machinename&amp;#39;))+ COALESCE(&amp;#39;\&amp;#39;+ CONVERT(varchar(35), SERVERPROPERTY(&amp;#39;instancename&amp;#39;)),&amp;#39;&amp;#39;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DECLARE @backuplog TABLE(&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;DBServer sysname,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;DBName sysname,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;LastFullBackup datetime,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;LastDiffBackup datetime,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;LastTranBackup datetime,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;DiffDays int,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;FullDays int,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;TranHours int&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;INSERT INTO @backuplog&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SELECT fullrec.server_name [DBServer],&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9; fullrec.database_name, &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9; fullrec.backup_finish_date LastFullBackup,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9; diffrec.backup_finish_date LastDiffBackup,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9; tranrec.backup_finish_date LastTranBackup,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9; datediff(dd,diffrec.backup_finish_date,getdate()) DiffDays,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9; datediff(dd,fullrec.backup_finish_date,getdate()) FullDays,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9; datediff(hh,tranrec.backup_finish_date,getdate()) TranHours&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FROM msdb..backupset as fullrec&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;left outer join msdb..backupset as tranrec &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;on tranrec.database_name = fullrec.database_name&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;and tranrec.server_name = fullrec.server_name&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;and tranrec.type = &amp;#39;L&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;and tranrec.backup_finish_date =&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9; ((select max(backup_finish_date) &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9; from msdb..backupset b2 &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9; where b2.database_name = fullrec.database_name&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9; and b2.server_name = fullrec.server_name &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9; and b2.type = &amp;#39;L&amp;#39;))&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;left outer join msdb..backupset as diffrec&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;on diffrec.database_name = fullrec.database_name&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;and diffrec.server_name = fullrec.server_name&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;and diffrec.type = &amp;#39;I&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;and diffrec.backup_finish_date =&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9; ((select max(backup_finish_date) &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9; from msdb..backupset b2 &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;where b2.database_name = fullrec.database_name &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9; and b2.server_name = fullrec.server_name &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9; and b2.type = &amp;#39;I&amp;#39;))&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;where fullrec.type = &amp;#39;D&amp;#39; -- full backups only&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;and fullrec.backup_finish_date = &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9; (select max(backup_finish_date) &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9; from msdb..backupset b2 &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9; where b2.database_name = fullrec.database_name &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9; and b2.server_name = fullrec.server_name &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9; and b2.type = &amp;#39;D&amp;#39;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;and fullrec.database_name in (select name from master..sysdatabases) &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;and fullrec.database_name &amp;lt;&amp;gt; &amp;#39;tempdb&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Union all&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-- never backed up&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;select @server&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;,name &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;,null&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;,NULL&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;,NULL &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;,NULL&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;,NULL&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;,NULL&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;from sys.databases as record&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;where not exists (select * from msdb..backupset where record.name = database_name and server_name = @server)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;and name &amp;lt;&amp;gt; &amp;#39;tempdb&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;and source_database_id is null --exclude snapshots&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SET @HTML = &amp;#39;&amp;lt;h2&amp;gt;Backups&amp;lt;/h2&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&amp;lt;table&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&amp;lt;tr&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&amp;lt;th&amp;gt;DB Server&amp;lt;/th&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&amp;lt;th&amp;gt;DB Name&amp;lt;/th&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&amp;lt;th&amp;gt;Last Full Backup&amp;lt;/th&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&amp;lt;th&amp;gt;Last Diff Backup&amp;lt;/th&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&amp;lt;th&amp;gt;Last Tran Backup&amp;lt;/th&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&amp;lt;th&amp;gt;Full Days&amp;lt;/th&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&amp;lt;th&amp;gt;Diff Days&amp;lt;/th&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&amp;lt;th&amp;gt;Tran Hours&amp;lt;/th&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&amp;lt;th&amp;gt;Recovery Model&amp;lt;/th&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&amp;lt;/tr&amp;gt;&amp;#39; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;+(SELECT DBServer td,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;DBName td,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;CAST(CASE WHEN FullDays IS NULL THEN &amp;#39;&amp;lt;div class=&amp;#34;Critical&amp;#34;&amp;gt;None/Unknown&amp;lt;/div&amp;gt;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;WHEN FullDays &amp;gt; @FullWarningThresholdDays THEN &amp;#39;&amp;lt;div class=&amp;#34;Warning&amp;#34;&amp;gt;&amp;#39; + LEFT(CONVERT(varchar,LastFullBackup,113),17) + &amp;#39;&amp;lt;/div&amp;gt;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;ELSE &amp;#39;&amp;lt;div class=&amp;#34;Healthy&amp;#34;&amp;gt;&amp;#39; + LEFT(CONVERT(varchar,LastFullBackup,113),17) + &amp;#39;&amp;lt;/div&amp;gt;&amp;#39; END as XML) td,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;CAST(CASE WHEN DiffDays IS NULL THEN &amp;#39;&amp;lt;div class=&amp;#34;Critical&amp;#34;&amp;gt;None/Unknown&amp;lt;/div&amp;gt;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;WHEN DiffDays &amp;gt; @DiffWarningThresholdDays THEN &amp;#39;&amp;lt;div class=&amp;#34;Warning&amp;#34;&amp;gt;&amp;#39; + LEFT(CONVERT(varchar,LastDiffBackup,113),17) + &amp;#39;&amp;lt;/div&amp;gt;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;ELSE &amp;#39;&amp;lt;div class=&amp;#34;Healthy&amp;#34;&amp;gt;&amp;#39; + LEFT(CONVERT(varchar,LastDiffBackup,113),17) + &amp;#39;&amp;lt;/div&amp;gt;&amp;#39; END as XML) td,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;CAST(CASE WHEN TranHours IS NULL THEN COALESCE(LEFT(NULLIF(recovery_model_desc,&amp;#39;SIMPLE&amp;#39;),0) + &amp;#39;&amp;lt;div class=&amp;#34;Critical&amp;#34;&amp;gt;None/Unknown&amp;lt;/div&amp;gt;&amp;#39;,&amp;#39;N/A&amp;#39;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;WHEN TranHours &amp;gt; @TranWarningThresholdHours THEN &amp;#39;&amp;lt;div class=&amp;#34;Warning&amp;#34;&amp;gt;&amp;#39; + LEFT(CONVERT(varchar,LastTranBackup,113),17) + &amp;#39;&amp;lt;/div&amp;gt;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;ELSE &amp;#39;&amp;lt;div class=&amp;#34;Healthy&amp;#34;&amp;gt;&amp;#39; + LEFT(CONVERT(varchar,LastTranBackup,113),17) + &amp;#39;&amp;lt;/div&amp;gt;&amp;#39; END as XML) td,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;FullDays td,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;DiffDays td,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;TranHours td,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;recovery_model_desc td&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;FROM @backuplog bl&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;LEFT JOIN sys.databases sdb on bl.DBName = sdb.name COLLATE SQL_Latin1_General_CP1_CI_AS AND bl.DBServer = @Server&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;WHERE DBServer = @@SERVERNAME&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;ORDER BY LastFullBackup,LastDiffBackup,LastTranBackup,DBName&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;FOR XML RAW(&amp;#39;tr&amp;#39;),ELEMENTS XSINIL&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;+ &amp;#39;&amp;lt;/table&amp;gt;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GO&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SET ANSI_NULLS ON&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GO&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SET QUOTED_IDENTIFIER ON&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GO&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CREATE PROC [dbo].[DBAChecks_ErrorLog](@NumDays int)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/* &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;Returns HTML for &amp;#34;ErrorLog.htm&amp;#34; attachment of DBA Checks Report&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;*/ &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SET NOCOUNT ON&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CREATE TABLE #ErrorLog(&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;LogDate datetime,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;ErrorSource nvarchar(max),&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;ErrorMessage nvarchar(max)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CREATE TABLE #ErrorLogs(&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;ID INT primary key not null,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;LogDate DateTime NOT NULL,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;LogFileSize bigint&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DECLARE @MinDate datetime&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SET @MinDate = CONVERT(datetime,CONVERT(varchar,DATEADD(d,-@NumDays,GetDate()),112),112)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--Get a list of available error logs&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;INSERT INTO #ErrorLogs(ID,LogDate,LogFileSize)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;EXEC master.dbo.xp_enumerrorlogs&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DECLARE @ErrorLogID int&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DECLARE cErrorLogs CURSOR FOR&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;SELECT ID&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;FROM #ErrorLogs&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;WHERE LogDate &amp;gt;= @MinDate&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;OPEN cErrorLogs&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FETCH NEXT FROM cErrorLogs INTO @ErrorLogID&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-- Read applicable error logs into the #errorlog table&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;WHILE @@FETCH_STATUS = 0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;BEGIN&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;INSERT INTO #ErrorLog(LogDate,ErrorSource,ErrorMessage)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;exec sp_readerrorlog @ErrorLogID&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;FETCH NEXT FROM cErrorLogs INTO @ErrorLogID&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;END&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CLOSE cErrorLogs&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DEALLOCATE cErrorLogs&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SELECT &amp;#39;&amp;lt;HTML&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;HEAD&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;style type=&amp;#34;text/css&amp;#34;&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;table {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/*width:100%;*/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;font:8pt tahoma,arial,sans-serif;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;border-collapse:collapse;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;th {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;color:#FFFFFF;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;font:bold 8pt tahoma,arial,sans-serif;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;background-color:#204c7d;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;padding-left:5px;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;padding-right:5px;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;td {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;color:#000000;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;font:8pt tahoma,arial,sans-serif;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;border:1px solid #DCDCDC;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;border-collapse:collapse;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.Warning {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;background-color:#FFFF00; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;color:#2E2E2E;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.Critical {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;background-color:#FF0000;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;color:#FFFFFF;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.Healthy {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;background-color:#458B00;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;color:#FFFFFF;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;/style&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;/HEAD&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;BODY&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Log Date&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Source&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Message&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&amp;#39; + &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(SELECT CONVERT(varchar,LogDate,120) td,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;CAST(&amp;#39;&amp;lt;div&amp;gt;&amp;lt;![CDATA[&amp;#39; + ErrorSource + N&amp;#39;]]&amp;gt;&amp;lt;/div&amp;gt;&amp;#39; as XML) td,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;CAST(&amp;#39;&amp;lt;div&amp;#39; + &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;CASE WHEN (ErrorMessage LIKE &amp;#39;%error%&amp;#39; OR ErrorMessage LIKE &amp;#39;%exception%&amp;#39; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;OR ErrorMessage LIKE &amp;#39;%stack dump%&amp;#39; OR ErrorMessage LIKE &amp;#39;%fail%&amp;#39;) &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;AND ErrorMessage NOT LIKE &amp;#39;%DBCC%&amp;#39; THEN &amp;#39; Class=&amp;#34;Critical&amp;#34;&amp;#39; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;WHEN ErrorMessage LIKE &amp;#39;%warning%&amp;#39; THEN &amp;#39; Class=&amp;#34;Warning&amp;#34;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;ELSE &amp;#39;&amp;#39; END &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;+ &amp;#39;&amp;gt;&amp;lt;![CDATA[&amp;#39; + ErrorMessage + N&amp;#39;]]&amp;gt;&amp;lt;/div&amp;gt;&amp;#39; as XML) td&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FROM #ErrorLog&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;WHERE LogDate &amp;gt;= @MinDate&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/*&#9;Remove any error log records that we are not interested in&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;ammend the where clause as appropriate&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;*/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AND ErrorMessage NOT LIKE &amp;#39;%This is an informational message%&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AND ErrorMessage NOT LIKE &amp;#39;Authentication mode is%&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AND ErrorMessage NOT LIKE &amp;#39;System Manufacturer%&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AND ErrorMessage NOT LIKE &amp;#39;All rights reserved.&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AND ErrorMessage NOT LIKE &amp;#39;Server Process ID is%&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AND ErrorMessage NOT LIKE &amp;#39;Starting up database%&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AND ErrorMessage NOT LIKE &amp;#39;Registry startup parameters%&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AND ErrorMessage NOT LIKE &amp;#39;(c) 2005 Microsoft%&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AND ErrorMessage NOT LIKE &amp;#39;Server is listening on%&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AND ErrorMessage NOT LIKE &amp;#39;Server local connection provider is ready to accept connection on%&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AND ErrorMessage NOT LIKE &amp;#39;Logging SQL Server messages in file%&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AND ErrorMessage &amp;lt;&amp;gt; &amp;#39;Clearing tempdb database.&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AND ErrorMessage &amp;lt;&amp;gt; &amp;#39;Using locked pages for buffer pool.&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AND ErrorMessage &amp;lt;&amp;gt; &amp;#39;Service Broker manager has started.&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ORDER BY LogDate DESC&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FOR XML RAW(&amp;#39;tr&amp;#39;),ELEMENTS XSINIL)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+ &amp;#39;&amp;lt;/table&amp;gt;&amp;lt;/HEAD&amp;gt;&amp;lt;/BODY&amp;gt;&amp;#39; as HTML&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DROP TABLE #ErrorLog&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DROP TABLE #ErrorLogs&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GO&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SET ANSI_NULLS ON&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GO&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SET QUOTED_IDENTIFIER ON&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GO&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CREATE PROC [dbo].[DBAChecks_DBFiles](&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;@IncludeDBs varchar(max)=NULL,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;@ExcludeDBs varchar(max)=&amp;#39;master,model,msdb,tempdb&amp;#39;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;@WarningThresholdPCT int=90,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;@CriticalThresholdPCT int=95,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;@HTML varchar(max) output&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/* &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;Returns HTML for &amp;#34;Database Files&amp;#34; section of DBA Checks Report&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;*/ &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CREATE TABLE #FileStats(&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;[db] sysname not null,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;[name] [sysname] not null,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;[file_group] [sysname] null,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;[physical_name] [nvarchar](260) NOT NULL,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;[type_desc] [nvarchar](60) NOT NULL,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;[size] [varchar](33) NOT NULL,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;[space_used] [varchar](33) NULL,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;[free_space] [varchar](33) NULL,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;[pct_used] [float] NULL,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;[max_size] [varchar](33) NOT NULL,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;[growth] [varchar](33) NOT NULL&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;) &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DECLARE @IncludeXML XML&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DECLARE @ExcludeXML XML&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DECLARE @DB sysname&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;IF @IncludeDBs = &amp;#39;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;BEGIN&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;SET @HTML = &amp;#39;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;DROP TABLE #FileStats&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;RETURN&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;END&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SELECT @IncludeXML = &amp;#39;&amp;lt;a&amp;gt;&amp;#39; + REPLACE(@IncludeDBs,&amp;#39;,&amp;#39;,&amp;#39;&amp;lt;/a&amp;gt;&amp;lt;a&amp;gt;&amp;#39;) + &amp;#39;&amp;lt;/a&amp;gt;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SELECT @ExcludeXML = &amp;#39;&amp;lt;a&amp;gt;&amp;#39; + REPLACE(@ExcludeDBs,&amp;#39;,&amp;#39;,&amp;#39;&amp;lt;/a&amp;gt;&amp;lt;a&amp;gt;&amp;#39;) + &amp;#39;&amp;lt;/a&amp;gt;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DECLARE cDBs CURSOR FOR&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;SELECT name FROM sys.databases&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;WHERE (name IN(SELECT n.value(&amp;#39;.&amp;#39;,&amp;#39;sysname&amp;#39;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;FROM @IncludeXML.nodes(&amp;#39;/a&amp;#39;) T(n))&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;OR @IncludeXML IS NULL)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;AND (name NOT IN(SELECT n.value(&amp;#39;.&amp;#39;,&amp;#39;sysname&amp;#39;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;FROM @ExcludeXML.nodes(&amp;#39;/a&amp;#39;) T(n))&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;OR @ExcludeXML IS NULL)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;AND source_database_id IS NULL&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;AND state = 0 --ONLINE&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;ORDER BY name&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;OPEN cDBs&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FETCH NEXT FROM cDBs INTO @DB&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;WHILE @@FETCH_STATUS = 0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;BEGIN&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;DECLARE @SQL nvarchar(max)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;SET @SQL =&#9;&#9; N&amp;#39;USE &amp;#39; + QUOTENAME(@DB) + &amp;#39;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;INSERT INTO #FileStats(db,name,file_group,physical_name,type_desc,size,space_used,free_space,[pct_used],max_size,growth)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;select DB_NAME() db,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;f.name,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;fg.name as file_group,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;f.physical_name,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;f.type_desc,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;CASE WHEN (f.size/128) &amp;lt; 1024 THEN CAST(f.size/128 as varchar) + &amp;#39;&amp;#39; MB&amp;#39;&amp;#39; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;ELSE CAST(CAST(ROUND(f.size/(128*1024.0),1) as float) as varchar) + &amp;#39;&amp;#39; GB&amp;#39;&amp;#39; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;END as size,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;CASE WHEN FILEPROPERTY(f.name,&amp;#39;&amp;#39;spaceused&amp;#39;&amp;#39;)/128 &amp;lt; 1024 THEN CAST(FILEPROPERTY(f.name,&amp;#39;&amp;#39;spaceused&amp;#39;&amp;#39;)/128 as varchar) + &amp;#39;&amp;#39; MB&amp;#39;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;ELSE CAST(CAST(ROUND(FILEPROPERTY(f.name,&amp;#39;&amp;#39;spaceused&amp;#39;&amp;#39;)/(128*1024.0),1) as float) as varchar) + &amp;#39;&amp;#39; GB&amp;#39;&amp;#39; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;END space_used,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;CASE WHEN (f.size - FILEPROPERTY(f.name,&amp;#39;&amp;#39;spaceused&amp;#39;&amp;#39;))/128 &amp;lt; 1024 THEN CAST((f.size - FILEPROPERTY(f.name,&amp;#39;&amp;#39;spaceused&amp;#39;&amp;#39;))/128 as varchar) + &amp;#39;&amp;#39; MB&amp;#39;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;ELSE CAST(CAST(ROUND((f.size - FILEPROPERTY(f.name,&amp;#39;&amp;#39;spaceused&amp;#39;&amp;#39;))/(128*1024.0),1) as float) as varchar) + &amp;#39;&amp;#39; GB&amp;#39;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;END free_space,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;ROUND((FILEPROPERTY(f.name,&amp;#39;&amp;#39;spaceused&amp;#39;&amp;#39;))/CAST(size as float)*100,2) as [pct_used],&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;CASE WHEN f.max_size =-1 THEN &amp;#39;&amp;#39;unlimited&amp;#39;&amp;#39; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;WHEN f.max_size/128 &amp;lt; 1024 THEN CAST(f.max_size/128 as varchar) + &amp;#39;&amp;#39; MB&amp;#39;&amp;#39; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;ELSE CAST(f.max_size/(128*1024) as varchar) + &amp;#39;&amp;#39; GB&amp;#39;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;END as max_size,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;CASE WHEN f.is_percent_growth=1 THEN CAST(f.growth as varchar) + &amp;#39;&amp;#39;%&amp;#39;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;WHEN f.growth = 0 THEN &amp;#39;&amp;#39;none&amp;#39;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;WHEN f.growth/128 &amp;lt; 1024 THEN CAST(f.growth/128 as varchar) + &amp;#39;&amp;#39; MB&amp;#39;&amp;#39; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;ELSE CAST(CAST(ROUND(f.growth/(128*1024.0),1) as float) as varchar) + &amp;#39;&amp;#39; GB&amp;#39;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;END growth&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;from sys.database_files f&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;LEFT JOIN sys.filegroups fg on f.data_space_id = fg.data_space_id&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;where f.type_desc &amp;lt;&amp;gt; &amp;#39;&amp;#39;FULLTEXT&amp;#39;&amp;#39;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;exec sp_executesql @SQL&#9;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;FETCH NEXT FROM cDBs INTO @DB&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;END&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CLOSE cDBs&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DEALLOCATE cDBs&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SELECT @HTML = &amp;#39;&amp;lt;h2&amp;gt;Database Files&amp;lt;/h2&amp;gt;&amp;lt;table&amp;gt;&amp;#39; + &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;(SELECT &amp;#39;Database&amp;#39; th,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&amp;#39;Name&amp;#39; th,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&amp;#39;File Group&amp;#39; th,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&amp;#39;File Path&amp;#39; th,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&amp;#39;Type&amp;#39; th,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&amp;#39;Size&amp;#39; th,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&amp;#39;Used&amp;#39; th,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&amp;#39;Free&amp;#39; th,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&amp;#39;Used %&amp;#39; th,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&amp;#39;Max Size&amp;#39; th,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&amp;#39;Growth&amp;#39; th&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;FOR XML RAW(&amp;#39;tr&amp;#39;),ELEMENTS ) +&#9;&#9;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;(SELECT db td,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;name td,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;file_group td,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;physical_name td,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;type_desc td,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;size td,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;space_used td,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;free_space td,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;CAST(CASE WHEN pct_used &amp;gt; @CriticalThresholdPCT &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;THEN &amp;#39;&amp;lt;div class=&amp;#34;Critical&amp;#34;&amp;gt;&amp;#39; + CAST(pct_used as varchar) + &amp;#39;&amp;lt;/div&amp;gt;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;WHEN pct_used &amp;gt; @WarningThresholdPCT &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;THEN &amp;#39;&amp;lt;div class=&amp;#34;Warning&amp;#34;&amp;gt;&amp;#39; + CAST(pct_used as varchar) + &amp;#39;&amp;lt;/div&amp;gt;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;ELSE &amp;#39;&amp;lt;div class=&amp;#34;Healthy&amp;#34;&amp;gt;&amp;#39; + CAST(pct_used as varchar) + &amp;#39;&amp;lt;/div&amp;gt;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;END as XML) td,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;max_size td,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;CAST(CASE WHEN growth=&amp;#39;none&amp;#39; THEN &amp;#39;&amp;lt;div class=&amp;#34;Warning&amp;#34;&amp;gt;&amp;#39; + growth + &amp;#39;&amp;lt;/div&amp;gt;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;ELSE growth END as XML) td&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;FROM #FileStats&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;ORDER BY db,type_desc DESC,file_group,name&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;FOR XML RAW(&amp;#39;tr&amp;#39;),ELEMENTS XSINIL) + &amp;#39;&amp;lt;/table&amp;gt;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DROP TABLE #FileStats&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GO&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SET ANSI_NULLS ON&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GO&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SET QUOTED_IDENTIFIER ON&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GO&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CREATE PROC [dbo].[DBAChecks_JobStats](@NumDays int,@HTML nvarchar(max) out)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/* &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;Returns HTML for &amp;#34;Agent Jobs Stats in the last &amp;#39;X&amp;#39; days&amp;#34; section of DBA Checks Report&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;*/ &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SET ANSI_WARNINGS OFF&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DECLARE @FromDate char(8)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SET @FromDate = CONVERT(char(8), (select dateadd (day,(-1*@NumDays), getdate())), 112);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;WITH nextRun as (&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;SELECT js.job_id, &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;MAX(CONVERT(datetime,CONVERT(CHAR(8), NULLIF(next_run_date,0), 112) &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;+ &amp;#39; &amp;#39; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;+ STUFF(STUFF(RIGHT(&amp;#39;000000&amp;#39; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;+ CONVERT(VARCHAR(8), next_run_time), 6), 5, 0, &amp;#39;:&amp;#39;), 3, 0, &amp;#39;:&amp;#39;) )&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;) as next_run_time&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;FROM msdb..sysjobschedules js&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;GROUP BY js.job_id&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;),&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lastRun as (&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;SELECT jh.job_id,CONVERT(datetime,CONVERT(CHAR(8), run_date, 112) &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;+ &amp;#39; &amp;#39; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;+ STUFF(STUFF(RIGHT(&amp;#39;000000&amp;#39; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;+ CONVERT(VARCHAR(8), run_time), 6), 5, 0, &amp;#39;:&amp;#39;), 3, 0, &amp;#39;:&amp;#39;) ) as last_run_time,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;run_status as last_run_status,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;CAST(message as nvarchar(max)) as last_result,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;ROW_NUMBER() OVER(PARTITION BY job_id ORDER BY run_date DESC,run_time DESC) rnum&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;FROM msdb..sysjobhistory jh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;WHERE run_status IN(0,1,3) --Succeeded/Failed/Cancelled&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;,JobStats AS (&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;select name,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;MAX(enabled) enabled,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;SUM(CASE WHEN run_status = 1 THEN 1 ELSE 0 END) as SucceededCount,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;SUM(CASE WHEN run_status = 0 THEN 1 ELSE 0 END) as FailedCount,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;SUM(CASE WHEN run_status = 3 THEN 1 ELSE 0 END) as CancelledCount,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;MAX(last_run_time) last_run_time,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;MAX(next_run_time) next_run_time,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;MAX(last_run_status) last_run_status,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;COALESCE(MAX(last_result),&amp;#39;Unknown&amp;#39;) last_result&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;from msdb..sysjobs j&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;LEFT JOIN msdb..sysjobhistory jh ON j.job_id = jh.job_id AND jh.run_date &amp;gt;= @FromDate and jh.step_id = 0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;LEFT JOIN nextrun ON j.job_id = nextrun.job_id&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;LEFT JOIN lastRun ON j.job_id = lastRun.job_id AND rnum=1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;GROUP BY name&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SELECT @HTML =N&amp;#39;&amp;lt;h2&amp;gt;Agent Job Stats in the last &amp;#39; + CAST(@NumDays as varchar) + N&amp;#39; days&amp;lt;/h2&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&amp;lt;table&amp;gt;&amp;#39; +&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;(SELECT &amp;#39;Name&amp;#39; th,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&amp;#39;Enabled&amp;#39; th,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&amp;#39;Succeeded&amp;#39; th,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&amp;#39;Failed&amp;#39; th,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&amp;#39;Cancelled&amp;#39; th,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&amp;#39;Last Run Time&amp;#39; th,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&amp;#39;Next Run Time&amp;#39; th,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&amp;#39;Last Result&amp;#39; th&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;FOR XML RAW(&amp;#39;tr&amp;#39;),ELEMENTS) &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;+ (SELECT name td,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;CAST(CASE WHEN enabled = 1 THEN N&amp;#39;&amp;lt;div class=&amp;#34;Healthy&amp;#34;&amp;gt;Yes&amp;lt;/div&amp;gt;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;ELSE N&amp;#39;&amp;lt;div class=&amp;#34;Warning&amp;#34;&amp;gt;No&amp;lt;/div&amp;gt;&amp;#39; END as XML) td,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;CAST(CASE WHEN SucceededCount = 0 THEN N&amp;#39;&amp;lt;div class=&amp;#34;Warning&amp;#34;&amp;gt;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;ELSE N&amp;#39;&amp;lt;div&amp;gt;&amp;#39; END&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;+ CAST(SucceededCount as varchar) + &amp;#39;&amp;lt;/div&amp;gt;&amp;#39; as XML) td,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;CAST(CASE WHEN FailedCount &amp;gt;0 THEN N&amp;#39;&amp;lt;div class=&amp;#34;Critical&amp;#34;&amp;gt;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;ELSE N&amp;#39;&amp;lt;div class=&amp;#34;Healthy&amp;#34;&amp;gt;&amp;#39; END&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;+ CAST(FailedCount as varchar) + N&amp;#39;&amp;lt;/div&amp;gt;&amp;#39; as XML) td,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;CAST(CASE WHEN CancelledCount &amp;gt;0 THEN N&amp;#39;&amp;lt;div class=&amp;#34;Critical&amp;#34;&amp;gt;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;ELSE N&amp;#39;&amp;lt;div class=&amp;#34;Healthy&amp;#34;&amp;gt;&amp;#39; END&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;+ CAST(CancelledCount as varchar) + N&amp;#39;&amp;lt;/div&amp;gt;&amp;#39; as XML) td,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;LEFT(CONVERT(varchar,last_run_time,13),17) td,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;LEFT(CONVERT(varchar,next_run_time,13),17) td,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;CAST(CASE WHEN last_run_status = 1 THEN N&amp;#39;&amp;lt;span class=&amp;#34;Healthy&amp;#34;&amp;gt;&amp;lt;![CDATA[&amp;#39; + last_result + N&amp;#39;]]&amp;gt;&amp;lt;/span&amp;gt;&amp;#39; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;ELSE N&amp;#39;&amp;lt;span class=&amp;#34;Critical&amp;#34;&amp;gt;&amp;lt;![CDATA[&amp;#39; + last_result + N&amp;#39;]]&amp;gt;&amp;lt;/span&amp;gt;&amp;#39; END AS XML) td &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;FROM JobStats&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;ORDER BY last_run_time DESC&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;FOR XML RAW(&amp;#39;tr&amp;#39;),ELEMENTS XSINIL&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;) + N&amp;#39;&amp;lt;/table&amp;gt;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GO&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SET ANSI_NULLS ON&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GO&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SET QUOTED_IDENTIFIER ON&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GO&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CREATE PROC [dbo].[DBAChecks_FailedAgentJobs](@HTML varchar(max) out,@NumDays int)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/* &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;Returns HTML for &amp;#34;Failed jobs in the last &amp;#39;X&amp;#39; days&amp;#34; section of DBA Checks Report&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;*/ &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DECLARE @FromDate char(8)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DECLARE @SucceededCount int&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SET @FromDate = CONVERT(char(8),dateadd (day,-@NumDays, getdate()), 112)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;IF EXISTS(&#9;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;SELECT *&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;FROM msdb..sysjobhistory jh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;JOIN msdb..sysjobs j ON jh.job_id = j.job_id&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;WHERE jh.run_status IN(0,3) -- Failed/Cancelled&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;AND jh.step_id &amp;lt;&amp;gt; 0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;AND&#9;run_date &amp;gt;= @FromDate)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;BEGIN&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SET @HTML = &amp;#39;&amp;lt;h2&amp;gt;Failed Jobs in the last &amp;#39; + CAST(@NumDays as varchar) + &amp;#39; days&amp;lt;/h2&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&amp;lt;table&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&amp;lt;tr&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&amp;lt;th&amp;gt;Date&amp;lt;/th&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&amp;lt;th&amp;gt;Job Name&amp;lt;/th&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&amp;lt;th&amp;gt;Job Status&amp;lt;/th&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&amp;lt;th&amp;gt;Step ID&amp;lt;/th&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&amp;lt;th&amp;gt;Step Name&amp;lt;/th&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&amp;lt;th&amp;gt;Message&amp;lt;/th&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&amp;lt;th&amp;gt;Run Duration&amp;lt;/th&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&amp;lt;/tr&amp;gt;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;+&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;(SELECT CONVERT(datetime,CAST(jh.run_date AS char(8)) + &amp;#39; &amp;#39; + STUFF(STUFF(RIGHT(&amp;#39;000000&amp;#39; + CONVERT(VARCHAR,jh.run_time),6),5,0,&amp;#39;:&amp;#39;),3,0,&amp;#39;:&amp;#39;),101) AS td,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;j.name AS td,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;CAST(CASE jh.run_status WHEN 0 THEN &amp;#39;&amp;lt;div class=&amp;#34;Critical&amp;#34;&amp;gt;Failed&amp;lt;/div&amp;gt;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;WHEN 3 THEN &amp;#39;&amp;lt;div class=&amp;#34;Warning&amp;#34;&amp;gt;Cancelled&amp;lt;/div&amp;gt;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;ELSE NULL END as XML) as td,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;jh.step_id as td,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;jh.step_name as td,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;jh.message as td,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;RIGHT(&amp;#39;00&amp;#39; +CAST(run_duration/10000 as varchar),2) + &amp;#39;:&amp;#39; +&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;RIGHT(&amp;#39;00&amp;#39; + CAST(run_duration/100%100 as varchar),2) + &amp;#39;:&amp;#39; +&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;RIGHT(&amp;#39;00&amp;#39; + CAST(run_duration%100 as varchar),2) as td&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;FROM&#9;msdb..sysjobhistory jh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;JOIN&#9;msdb..sysjobs j&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;ON jh.job_id = j.job_id&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;WHERE&#9;jh.run_status IN(0,3) -- Failed/Cancelled&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;AND jh.step_id &amp;lt;&amp;gt; 0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;AND&#9;run_date &amp;gt;= @FromDate&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;ORDER BY CONVERT(datetime,CAST(jh.run_date AS char(8)) + &amp;#39; &amp;#39; + STUFF(STUFF(RIGHT(&amp;#39;000000&amp;#39; + CONVERT(VARCHAR,jh.run_time),6),5,0,&amp;#39;:&amp;#39;),3,0,&amp;#39;:&amp;#39;),101) DESC&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;FOR XML RAW(&amp;#39;tr&amp;#39;),ELEMENTS XSINIL&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;+ &amp;#39;&amp;lt;/table&amp;gt;&amp;lt;br/&amp;gt;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;END&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ELSE&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;BEGIN&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;SET @HTML = &amp;#39;&amp;lt;h2&amp;gt;Failed Jobs in the last &amp;#39; + CAST(@NumDays as varchar) + &amp;#39; days&amp;lt;/h2&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&amp;lt;span class=&amp;#34;Healthy&amp;#34;&amp;gt;No failed jobs&amp;lt;/span&amp;gt;&amp;lt;br/&amp;gt;&amp;#39;&#9;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;END&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GO&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SET ANSI_NULLS ON&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GO&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SET QUOTED_IDENTIFIER ON&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GO&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CREATE PROC [dbo].[DBAChecks_DiskDrives](@PCTFreeWarningThreshold int,@PCTFreeCriticalThreshold int,@HTML varchar(max) out)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/* &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;Returns HTML for &amp;#34;Disk Drives&amp;#34; section of DBA Checks Report&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;*/ &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DECLARE @BytesToTB float,@BytesToGB float,@BytesToMB float&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SELECT @BytesToTB = 1099511627776,@BytesToGB = 1073741824,@BytesToMB=1048576.0;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;WITH DriveInfo AS (&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;SELECT drive,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;volume_label,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;CASE WHEN total_size &amp;gt; @BytesToTB THEN CAST(ROUND(total_size /@BytesToTB,1) as varchar) + &amp;#39;TB&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;WHEN total_size &amp;gt; @BytesToGB THEN CAST(ROUND(total_size /@BytesToGB,1) as varchar) + &amp;#39;GB&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;ELSE CAST(ROUND(total_size / @BytesToMB,1) as varchar) + &amp;#39;MB&amp;#39; END as Size,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;CASE WHEN free_space &amp;gt; @BytesToTB THEN CAST(ROUND(free_space /@BytesToTB,1) as varchar) + &amp;#39;TB&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;WHEN free_space &amp;gt; @BytesToGB THEN CAST(ROUND(free_space /@BytesToGB,1) as varchar) + &amp;#39;GB&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;ELSE CAST(ROUND(free_space / @BytesToMB,1) as varchar) + &amp;#39;MB&amp;#39; END as Free,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;ROUND(free_space/cast(total_size as float)*100,2) as PercentFree&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;FROM dbo.SQLIO_fnGetDrives()&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;WHERE drive_type=3 --Fixed&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SELECT @HTML = &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&amp;#39;&amp;lt;h2&amp;gt;Disk Drives&amp;lt;/h2&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&amp;lt;table&amp;gt;&amp;#39; +&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;(SELECT &amp;#39;Drive&amp;#39; th,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&amp;#39;Label&amp;#39; th,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&amp;#39;Size&amp;#39; th,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&amp;#39;Free&amp;#39; th,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&amp;#39;Free %&amp;#39; th&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;FOR XML RAW(&amp;#39;tr&amp;#39;),ELEMENTS) &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;+&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;(SELECT drive td,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;volume_label td,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;Size td,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;Free td,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;CAST(CASE WHEN PercentFree &amp;lt; @PCTFreeCriticalThreshold THEN &amp;#39;&amp;lt;div class=&amp;#34;Critical&amp;#34;&amp;gt;&amp;#39; + CAST(PercentFree as varchar) + &amp;#39;&amp;lt;/div&amp;gt;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;WHEN PercentFree &amp;lt; @PCTFreeWarningThreshold THEN &amp;#39;&amp;lt;div class=&amp;#34;Warning&amp;#34;&amp;gt;&amp;#39; + CAST(PercentFree as varchar) + &amp;#39;&amp;lt;/div&amp;gt;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;ELSE &amp;#39;&amp;lt;div class=&amp;#34;Healthy&amp;#34;&amp;gt;&amp;#39; + CAST(PercentFree as varchar) + &amp;#39;&amp;lt;/div&amp;gt;&amp;#39; END as XML) td&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;FROM DriveInfo &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;FOR XML RAW(&amp;#39;tr&amp;#39;),ELEMENTS XSINIL)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;+ &amp;#39;&amp;lt;/table&amp;gt;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GO&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SET ANSI_NULLS ON&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GO&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SET QUOTED_IDENTIFIER ON&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GO&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CREATE PROC [dbo].[DBAChecks](&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;/* Agent Jobs related Params */&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;@AgentJobsNumDays int=3, --Num of days to report failed jobs over&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;/* Database Files related Params */&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;@FileStatsIncludedDatabases varchar(max)=NULL, -- Comma sep list of databases to report filestats for. NULL=All, &amp;#39;&amp;#39; = None&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;@FileStatsExcludedDatabases varchar(max)=NULL, -- Comma sep list of databases to report filestats for. NULL=No Exclusions&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;@FileStatsPctUsedWarning int=90, -- Warn (Yellow) if free space in a database file is less than this threshold (Just for database specified in @FileStatsDatabases)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;@FileStatsPctUsedCritical int=95, -- Warn (Red) if free space in a database file is less than this threshold (Just for database specified in @FileStatsDatabases)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;/* Backup related Params */&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;@DiffWarningThresholdDays int=3, -- Backup warning if no diff backup for &amp;#34;x&amp;#34; days&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;@FullWarningThresholdDays int=7, -- Backup warning if no full backup for &amp;#34;x&amp;#34; days&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;@TranWarningThresholdHours int=4, -- Backup warning if no tran backup for &amp;#34;x&amp;#34; hours&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;/* Disc Drive related params*/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;@FreeDiskSpacePercentWarningThreshold int=15, -- Warn (Yellow) if free space is less than this threshold&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;@FreeDiskSpacePercentCriticalThreshold int=10, -- Warn (Red) if free space is less than this threshold&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;/* General related params */&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;@UptimeCritical int = 1440, -- Critical/Red if system uptime (in minutes) is less than this value&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;@UptimeWarning int = 2880, -- Warn/Yellow if system uptime (in minutes) is less than this value,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;/* Error Log Params */&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;@ErrorLogDays int = 3,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;/* Email/Profile params */&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;@Recipients nvarchar(max), -- Email list&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;@MailProfile sysname=NULL&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/*&#9;Created By David Wiseman&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;Version: 1.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;http://www.wisesoft.co.uk&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;Generates a DBA Checks HTML email report&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;*/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SET NOCOUNT ON&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DECLARE @AgentJobsHTML varchar(max)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DECLARE @AgentJobStatsHTML varchar(max)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DECLARE @FileStatsHTML varchar(max)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DECLARE @DisksHTML varchar(max)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DECLARE @BackupsHTML varchar(max)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DECLARE @HTML varchar(max)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DECLARE @Uptime varchar(max)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SELECT @Uptime = &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;CASE WHEN DATEDIFF(mi,create_date,GetDate()) &amp;lt; @UptimeCritical THEN &amp;#39;&amp;lt;span class=&amp;#34;Critical&amp;#34;&amp;gt;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;WHEN DATEDIFF(mi,create_date,GetDate()) &amp;lt; @Uptimewarning THEN &amp;#39;&amp;lt;span class=&amp;#34;Warning&amp;#34;&amp;gt;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;ELSE &amp;#39;&amp;lt;span class=&amp;#34;Healthy&amp;#34;&amp;gt;&amp;#39; END + &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;-- get system uptime&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;COALESCE(NULLIF(CAST((DATEDIFF(mi,create_date,GetDate())/1440 ) as varchar),&amp;#39;0&amp;#39;) + &amp;#39; day(s), &amp;#39;,&amp;#39;&amp;#39;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;+ COALESCE(NULLIF(CAST(((DATEDIFF(mi,create_date,GetDate())%1440)/60) as varchar),&amp;#39;0&amp;#39;) + &amp;#39; hour(s), &amp;#39;,&amp;#39;&amp;#39;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;+ CAST((DATEDIFF(mi,create_date,GetDate())%60) as varchar) + &amp;#39;min&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;--&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;+ &amp;#39;&amp;lt;/span&amp;gt;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FROM sys.databases &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;WHERE NAME=&amp;#39;tempdb&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;exec dbo.DBAChecks_FailedAgentJobs @HTML=@AgentJobsHTML out,@NumDays=@AgentJobsNumDays&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;exec dbo.DBAChecks_JobStats @HTML=@AgentJobStatsHTML out,@NumDays=@AgentJobsNumDays&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;exec dbo.DBAChecks_DBFiles &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;@IncludeDBs=@FileStatsIncludedDatabases,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;@ExcludeDBs=@FileStatsExcludedDatabases,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;@WarningThresholdPCT=@FileStatsPctUsedWarning,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;@CriticalThresholdPCT=@FileStatsPctUsedCritical,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;@HTML=@FileStatsHTML out&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;exec dbo.DBAChecks_DiskDrives @HTML=@DisksHTML out,@PCTFreeWarningThreshold=@FreeDiskSpacePercentWarningThreshold,@PCTFreeCriticalThreshold=@FreeDiskSpacePercentCriticalThreshold &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;exec dbo.DBAChecks_Backups @HTML=@BackupsHTML OUT,@DiffWarningThresHoldDays=@DiffWarningThresHoldDays,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;@FullWarningThresholdDays=@FullWarningThresholdDays ,@TranWarningThresholdHours=@FullWarningThresholdDays&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SET @HTML = &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;#39;&amp;lt;!DOCTYPE HTML PUBLIC &amp;#34;-//W3C//DTD HTML 4.01 Transitional//EN&amp;#34;&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;html&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;head&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;style type=&amp;#34;text/css&amp;#34;&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;table {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;font:8pt tahoma,arial,sans-serif;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;th {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;color:#FFFFFF;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;font:bold 8pt tahoma,arial,sans-serif;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;background-color:#204c7d;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;padding-left:5px;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;padding-right:5px;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;td {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;color:#000000;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;font:8pt tahoma,arial,sans-serif;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;border:1px solid #DCDCDC;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;border-collapse:collapse;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;padding-left:3px;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;padding-right:3px;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.Warning {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;background-color:#FFFF00; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;color:#2E2E2E;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.Critical {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;background-color:#FF0000;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;color:#FFFFFF;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.Healthy {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;background-color:#458B00;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;color:#FFFFFF;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;h1 {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;color:#FFFFFF;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;font:bold 16pt arial,sans-serif;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;background-color:#204c7d;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;text-align:center;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;h2 {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;color:#204c7d;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;font:bold 14pt arial,sans-serif;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;h3 {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;color:#204c7d;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;font:bold 12pt arial,sans-serif;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;body {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;color:#000000;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;font:8pt tahoma,arial,sans-serif;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;margin:0px;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;padding:0px;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;/style&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;/head&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;body&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;h1&amp;gt;DBA Checks Report for &amp;#39; + @@SERVERNAME + &amp;#39;&amp;lt;/h1&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;h2&amp;gt;General Health&amp;lt;/h2&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;b&amp;gt;System Uptime (SQL Server): &amp;#39; + @Uptime + &amp;#39;&amp;lt;/b&amp;gt;&amp;lt;br/&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;b&amp;gt;Version: &amp;lt;/b&amp;gt;&amp;#39; + CAST(SERVERPROPERTY(&amp;#39;productversion&amp;#39;) as nvarchar(max)) + &amp;#39; &amp;#39; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;+ CAST(SERVERPROPERTY (&amp;#39;productlevel&amp;#39;) as nvarchar(max))&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; + &amp;#39; &amp;#39; + CAST(SERVERPROPERTY (&amp;#39;edition&amp;#39;) as nvarchar(max)) &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+ COALESCE(@DisksHTML,&amp;#39;&amp;lt;div class=&amp;#34;Critical&amp;#34;&amp;gt;Error collecting Disk Info&amp;lt;/div&amp;gt;&amp;#39;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+ COALESCE(@BackupsHTML,&amp;#39;&amp;lt;div class=&amp;#34;Critical&amp;#34;&amp;gt;Error collecting Backup Info&amp;lt;/div&amp;gt;&amp;#39;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+ COALESCE(@AgentJobStatsHTML,&amp;#39;&amp;lt;div class=&amp;#34;Critical&amp;#34;&amp;gt;Error collecting Agent Jobs Stats&amp;lt;/div&amp;gt;&amp;#39;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+ COALESCE(@AgentJobsHTML,&amp;#39;&amp;lt;div class=&amp;#34;Critical&amp;#34;&amp;gt;Error collecting Agent Jobs Info&amp;lt;/div&amp;gt;&amp;#39;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+ COALESCE(@FileStatsHTML,&amp;#39;&amp;lt;div class=&amp;#34;Critical&amp;#34;&amp;gt;Error collecting File Stats Info&amp;lt;/div&amp;gt;&amp;#39;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+ &amp;#39;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;declare @subject varchar(50)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set @subject = &amp;#39;DBA Checks (&amp;#39; + @@SERVERNAME + &amp;#39;)&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DECLARE @ErrorLogSQL nvarchar(max)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DECLARE @ExecuteQueryDB sysname&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SET @ErrorLogSQL = &amp;#39;exec DBAChecks_ErrorLog @NumDays=&amp;#39; + CAST(@ErrorLogDays as varchar)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SET @ExecuteQueryDB = DB_NAME()&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;EXEC msdb.dbo.sp_send_dbmail&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;@query=@ErrorLogSQL,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;@attach_query_result_as_file = 1,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;@query_attachment_filename = &amp;#39;ErrorLog.htm&amp;#39;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;@query_result_header = 0,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;@query_no_truncate = 1,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;@query_result_width=32767,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;@recipients =@Recipients,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;@body = @HTML,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;@body_format =&amp;#39;HTML&amp;#39;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;@subject = @subject,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;@execute_query_database=@ExecuteQueryDB,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;@profile_name = @MailProfile&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GO&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="version-history"&gt;Version History&lt;/h2&gt;&#10;&lt;figure class="wp-block-table"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Date&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Version&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Notes&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;03-Apr-2012&lt;/td&gt;&lt;td&gt;&lt;strong&gt;&lt;a href="https://wisedataman.com/wp-content/uploads/2020/05/DBAChecks_Version1.2Beta.zip"&gt;Version 1.2 BETA&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Fix to DBAChecks_JobStats stored procedure. &amp;nbsp;Added CDATA section.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;14-Dec-2010&lt;/td&gt;&lt;td&gt;&lt;a href="https://wisedataman.com/wp-content/uploads/2020/05/DBAChecks_Version1.1Beta.zip"&gt;Version 1.1 BETA&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Fixed datetime conversion bug in DBAChecks_JobStats procedure.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;13-Jul-2009&lt;/td&gt;&lt;td&gt;&lt;a href="https://wisedataman.com/wp-content/uploads/2020/05/DBAChecks_Version1Beta.zip"&gt;Version 1.0 BETA&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Beta release&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/figure&gt;&#10;&lt;h2 id="running-the-report"&gt;Running the report&lt;/h2&gt;&#10;&lt;p&gt;The DBA Checks report is run by executing the &lt;strong&gt;dbo.DBAChecks&lt;/strong&gt; stored procedure.  This stored procedure takes a number of parameters, but only one is required:exec dbo.DBAChecks @recipients=&amp;lsquo;&lt;a href="mailto:dummyemail@wisesoft.co.uk"&gt;dummyemail@wisesoft.co.uk&lt;/a&gt;&amp;rsquo;&lt;/p&gt;&#10;&lt;p&gt;The code below shows a call to the DBAChecks stored procedure with all parameters specified:EXEC dbo.DBAChecks @AgentJobsNumDays=3,&lt;br&gt;&#10;@FileStatsIncludedDatabases=NULL,&lt;br&gt;&#10;@FileStatsExcludedDatabases=NULL,&lt;br&gt;&#10;@FileStatsPctUsedWarning=90,&lt;br&gt;&#10;@FileStatsPctUsedCritical=95,&lt;br&gt;&#10;@DiffWarningThresholdDays=3,&lt;br&gt;&#10;@FullWarningThresholdDays=7,&lt;br&gt;&#10;@TranWarningThresholdHours=4,&lt;br&gt;&#10;@FreeDiskSpacePercentWarningThreshold=15,&lt;br&gt;&#10;@FreeDiskSpacePercentCriticalThreshold=10,&lt;br&gt;&#10;@UptimeCritical=1440 ,&lt;br&gt;&#10;@UptimeWarning=2880,&lt;br&gt;&#10;@ErrorLogDays=3,&lt;br&gt;&#10;@Recipients=&amp;lsquo;&lt;a href="mailto:dummyemail@wisesoft.co.uk"&gt;dummyemail@wisesoft.co.uk&lt;/a&gt;&amp;rsquo;,&lt;br&gt;&#10;@MailProfile=NULL&lt;/p&gt;&#10;&lt;p&gt;A full explanation of these parameters is available here:&lt;/p&gt;&#10;&lt;figure class="wp-block-table"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;@AgentJobsNumDays&lt;/td&gt;&lt;td&gt;The number of days SQL&amp;nbsp;SQL&amp;nbsp;Server jobs are reported over.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;@FileStatsIncludedDatabases&lt;/td&gt;&lt;td&gt;A list of databases (comma-separated) to display file stats for.&amp;nbsp; Default value is NULL&amp;nbsp;(All databases).&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;@FileStatsExcludedDatabases&lt;/td&gt;&lt;td&gt;A list of databases (comma-separated) that are excluded from database file stats.&amp;nbsp; Default values is NULL&amp;nbsp;(No excluded databases)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;@FileStatsPctUsedWarning&lt;/td&gt;&lt;td&gt;If the percent used space&amp;nbsp;in the database file is larger than this value (but less&amp;nbsp;than critical threshold)&amp;nbsp;it will be highlighted in yellow.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;@FileStatsPctUsedCritical&lt;/td&gt;&lt;td&gt;If the percent used space in the database file is larger than this value it will be highlighted in red.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;@DiffWarningThresholdDays&lt;/td&gt;&lt;td&gt;Highlights differential backups that have not been completed for over "X" number of days&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;@FullWarningThresholdDays&lt;/td&gt;&lt;td&gt;Highlights full backups that have not been completed for over "X" number of days&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;@TranWarningThresholdHours&lt;/td&gt;&lt;td&gt;Highlights transaction log&amp;nbsp;backups that have not been completed for over "X" number of hours.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;@FreeDiskSpacePercentWarningThreshold&lt;/td&gt;&lt;td&gt;Used to highlight disk drives with low disk space in yellow, where the free disk space percent is less than the value specified.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;@FreeDiskSpacePercentCriticalThreshold&lt;/td&gt;&lt;td&gt;Used to highlight disk drives with low disk space in red, where the free disk space percent is less than the value specified.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;@UptimeCritical&lt;/td&gt;&lt;td&gt;The uptime in minutes threshold that causes the uptime to be highlighted in red.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;@UptimeWarning&lt;/td&gt;&lt;td&gt;The uptime in minutes threshold that causes the uptime to be highlighted in yellow.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;@ErrorLogDays&lt;/td&gt;&lt;td&gt;The number of days worth of events included in the attached error log html file.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;@Recipients&lt;/td&gt;&lt;td&gt;The email addresses where the report will be sent.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;nbsp;@MailProfile&lt;/td&gt;&lt;td&gt;The mail profile used to send the email.&amp;nbsp; NULL = default profile.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/figure&gt;&#10;&lt;h2 id="database-code"&gt;Database Code&lt;/h2&gt;&#10;&lt;figure class="wp-block-table"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Name&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Info&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;dbo.DBAChecks&lt;/td&gt;&lt;td&gt;This is the stored procedure you run to generate the email report. The stored procedure collates the information from the other stored procedures into a single email report.&amp;nbsp;&amp;nbsp; The parameters are described in the previous section.&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;dbo.DBAChecks_Backups&lt;/td&gt;&lt;td&gt;Produces HTML for the "Backups" section of the report.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;dbo.DBAChecks_DBFiles&lt;/td&gt;&lt;td&gt;Produces HTML for the "Database Files" section of the report.&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;dbo.DBAChecks_DiskDrives&lt;/td&gt;&lt;td&gt;Produces HTML for the "Disk Drives" section of the report.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;dbo.DBAChecks_ErrorLog&lt;/td&gt;&lt;td&gt;Produces HTML for the "ErrorLog.htm" report attachment.&amp;nbsp;&amp;nbsp;&lt;strong&gt;Review and ammend the filter applied to the error log as appropriate&lt;/strong&gt;.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;dbo.DBAChecks_FailedAgentJobs&lt;/td&gt;&lt;td&gt;Produces HTML for the "Failed&amp;nbsp;Jobs" section of the report.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;dbo.DBAChecks_JobStats&lt;/td&gt;&lt;td&gt;Produces HTML for the "Agent Job Stats" section of the report&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;dbo.SQLIO_fnGetDrives()&lt;/td&gt;&lt;td&gt;This CLR function is used by the dbo.DBAChecks_DiskDrives stored procedure to produce the report on disk drives and their available free space.&amp;nbsp; This function can be obtained here.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/figure&gt;&#10;&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;&#10;&lt;p&gt;Daily checks are an important part of any DBA&amp;rsquo;s routine, giving you confidence that your SQL instances are running problem free and allowing you to take corrective actions when required.  Alerts are also important, but these should be used to compliment daily checks, rather than to replace them.  If you rely on by exception reporting only, your servers will be at risk if something happens to the alert process. &lt;/p&gt;&#10;&lt;p&gt;I&amp;rsquo;m sure there are a wide variety of methods people currently use to perform their daily checks. The process you use is not important as long as it enables you to effectively monitor your SQL Server instances. If you&amp;rsquo;ve already got a routine that works for you - great!  If not, hopefully this article will provide you with a better solution.&lt;/p&gt;&#10;</description></item></channel></rss>